如何在R数据框中将UTC时间戳转换为多个本地时区?

3

我有一个数据框 df,它有两列(UTC时间戳和时区),我想创建一列,显示基于本地时区的本地时间。我尝试了一些方法,如下所示。

This is my dataframe 

df<-data.frame(utc_time_stamp=c("2019-04-28 18:35:26","2019-04-28 21:28:58","2019-04-28 18:59:01"),time_zone=c("Asia/Tokyo","Australia/Brisbane","Etc/GMT-12"))


#This is what I tried 

df$utc_time_stamp<-as.POSIXct(df$utc_time_stamp,format="%Y-%m-%d %H:%M:%S",tz='GMT')


df$new_local_time<-format(df$utc_time_stamp,tz=df$time_zone,usetz=TRUE)



#This is the error I get 

Error in as.POSIXlt.POSIXct(x, tz) : invalid 'tz' value

请注意,一个列中不能有不同时区的日期时间。"new_local_time" 必须是字符串。 - Arthur Yip
1个回答

3
你遇到了一个问题,即a) 因子和b) 传递向量的问题。因此,一种解决方法是将stringsAsFactors设置为FALSE,并创建一个函数来Vectorize你的输入:
df <- data.frame(..., stringsAsFactors=FALSE)

df$utc_time_stamp <- as.POSIXct(df$utc_time_stamp, format="%Y-%m-%d %H:%M:%S", tz='GMT')

tz_v <- Vectorize(function(x,y) {format(x, tz=y, usetz=TRUE)})

df$new_local_time <- tz_v(df$utc_time_stamp, df$time_zone)
df

输出:

>>>        utc_time_stamp          time_zone           new_local_time
>>> 1 2019-04-28 18:35:26         Asia/Tokyo  2019-04-29 03:35:26 JST
>>> 2 2019-04-28 21:28:58 Australia/Brisbane 2019-04-29 07:28:58 AEST
>>> 3 2019-04-28 18:59:01         Etc/GMT-12  2019-04-29 06:59:01 +12

如果我想在sparklyr中做同样的事情,这个脚本该如何更改?TIA - Yogesh Kumar
也许可以用“dplyr”来整理数据,使用tidyverse解决方案:df %>% group_by(time_zone) %>% mutate(new_local_time=format(utc_time_stamp, tz=time_zone, usetz=TRUE))。如果没有大型数据集在手,很难说清楚。 - Berenger
“tz_v <- Vectorize(function(x,y) {format(x, tz=y, usetz=TRUE)})” 的等价语句是什么?我该如何在 dyplyr 中实现这个向量化的目标? - Yogesh Kumar
如果您使用dplyr,则无需进行向量化。只需将上面的代码直接应用于df(在我上面的解决方案的第二行之后)。 - Berenger
1
它对我发布的 df 版本有效。我注意到您在原始帖子中拼写为 time_zonne 而不是 time_zone。可能是这个原因吗? - Berenger
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接