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

时间:2016-09-13 12:15:11

标签: r postgresql dplyr lubridate

我使用RPostgreSQL从Postgres数据库中提取数据,在导入R时将时间戳转换为系统时区。因此,导入后我想设置所有时间戳的时区到UTC。我想我可以使用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()

2 个答案:

答案 0 :(得分:2)

这有效:

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

这是否优雅?

答案 1 :(得分:1)

要在mutate_if中使用点表示法,该函数必须包含在funs中。

library(lubridate)

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

但是,目前您无法在package::中使用funs表示法。相反,你必须像我上面那样显式加载包(相关的github问题here)。