使用 mutate_if 和 force_tz 更改所有时间戳的时区
Changing time zone on all timestamps using mutate_if and force_tz
我正在使用 RPostgreSQL
从 Postgres 数据库中提取数据,它在导入 R 时将时间戳转换为系统时区。因此,导入后我想设置所有时间戳的时区到协调世界时。我以为我可以使用 dplyr
和 lubridate
优雅地做到这一点,就像这样:
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)。
我正在使用 RPostgreSQL
从 Postgres 数据库中提取数据,它在导入 R 时将时间戳转换为系统时区。因此,导入后我想设置所有时间戳的时区到协调世界时。我以为我可以使用 dplyr
和 lubridate
优雅地做到这一点,就像这样:
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)。