“无效的‘tz’值”错误的根源是因为,无论出于何种原因,R 不接受tz = df$var
。如果你设置tz = 'America/New_York'
或者其他一些字符值,那么它就会起作用。
更好的答案(而不是使用下面的force_tz)根据位置将UTC时间转换为各种时区。它也比循环或使用嵌套 ifelse 更简单、更好。我根据时区列对 tz 进行子集化和更改(我的数据已有该列,如果没有,您可以创建它)。只需确保您考虑了数据中的所有时区
(unique(df$timezone))
df$datetime2[df$timezone == 'America/New_York'] <- format(df$datetime, tz="America/New_York")[df$timezone == 'America/New_York']
df$datetime2[df$timezone == 'America/Chicago'] <- format(df$datetime, tz="America/Chicago")[df$timezone == 'America/Chicago']
df$datetime2[df$timezone == 'America/Denver'] <- format(df$datetime, tz="America/Denver")[df$timezone == 'America/Denver']
df$datetime2[df$timezone == 'America/Los_Angeles'] <- format(df$datetime, tz="America/Los_Angeles")[df$timezone == 'America/Los_Angeles']
以前的解决方案:转换为 R 中的本地时间 - 时区向量 https://stackoverflow.com/questions/32084042/converting-to-local-time-in-r-vector-of-timezones
require(lubridate)
require(dplyr)
df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"), localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)
df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")
df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))
df