使用 mutate_if 和 force_tz 更改所有时间戳的时区

Changing time zone on all timestamps using mutate_if and force_tz

我正在使用 RPostgreSQL 从 Postgres 数据库中提取数据,它在导入 R 时将时间戳转换为系统时区。因此,导入后我想设置所有时间戳的时区到协调世界时。我以为我可以使用 dplyrlubridate 优雅地做到这一点,就像这样:

df %>%
   mutate_if(lubridate::is.POSIXct, lubridate::force_tz(., tzone='UTC')) -> df

但这抛出

Error in UseMethod("as.fun_list") : 
  no applicable method for 'as.fun_list' applied to an object of class "data.frame"

所以我显然用错了mutate_if()

这个有效:

df %>%
  dplyr::mutate_if(lubridate::is.POSIXct,
                   function(x) lubridate::force_tz(x, tzone='UTC')) -> df

这个类似的 purrr 解决方案也是如此:

df %>%
  purrr::map_if(lubridate::is.POSIXct,
                ~ lubridate::force_tz(., tzone='UTC')) %>%
  as_data_frame -> df

这样优雅吗?

要在 mutate_if 中使用点符号,函数必须包装在 funs 中。

library(lubridate)

df %>%
    mutate_if(is.POSIXct, funs(force_tz(., tzone='UTC')))

但是,目前您不能在 funs 中使用 package:: 符号。相反,您必须像我上面那样显式加载包(相关 github 问题 here)。