【问题标题】:How to convert UTC timestamps to multiple local time zones in R Data Frame?如何将 UTC 时间戳转换为 R 数据框中的多个本地时区?
【发布时间】:2019-04-30 10:24:22
【问题描述】:

我有一个数据框 df,它有 2 列(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" 必须是字符串。

标签: r dataframe lubridate


【解决方案1】:

您在 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
  • 如果 df 是大文件 (5GB),那么 "df$new_local_time
  • 也许是一个带有dplyr的tidyverse解决方案:df %&gt;% group_by(time_zone) %&gt;% mutate(new_local_time=format(utc_time_stamp, tz=time_zone, usetz=TRUE))。如果没有大的 ds,我很难说。
  • “tz_v
  • 它适用于我发布的 df 版本。我注意到您在原始帖子中使用了 time_zonne 而不是 time_zone。会是这样吗?
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 2019-08-15
  • 2018-04-17
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2021-04-25
  • 2011-02-06
相关资源
最近更新 更多