我有一个POSIXct
向量,它稍微滥用了这种格式:
> head(df$datetime)
[1] "2016-03-03 12:30:00 UTC" "2016-03-03 12:00:00 UTC" "2016-02-27 09:00:00 UTC" "2016-03-03 17:30:00 UTC"
[5] "2016-03-03 10:30:00 UTC" "2016-03-03 14:30:00 UTC"
这些日期时间标记为UTC时间,但实际上是各种本地时区的时间:
> df %>% select(datetime, timezone) %>% head
datetime timezone
1 2016-03-03 12:30:00 Australia/Melbourne
2 2016-03-03 12:00:00 Europe/Berlin
3 2016-02-27 09:00:00 Europe/Amsterdam
4 2016-03-03 17:30:00 Australia/Brisbane
5 2016-03-03 10:30:00 Europe/Amsterdam
6 2016-03-03 14:30:00 Europe/Berlin
我希望将这些日期时间转换为UTC时间 - 在某种意义上,这是与这里和这里所面临的相反问题 - 但我遇到了困难。第二个链接中的解决方案的变体可行:
get_utc_time <- function(timestamp_local, local_tz) {
l <- lapply(seq(length(timestamp_local)),
function(x) {with_tz(force_tz(timestamp_local[x], tzone=local_tz[x]), tzone='UTC')})
as.POSIXct(combine(l), origin = '1970-01-01 00:00.00', tz = 'UTC')
}
df$datetime_utc <- get_utc_time(df$datetime, df$timezone)
(dplyr::mutate(df, datetime_utc = get_utc_time(datetime, timezone))
引发了错误,我原本认为这两者是等价的。)
但是由于这种方法没有向量化,对于一个有50万行的数据框来说速度非常慢。有没有更加优雅和快速的方法来完成这个任务呢?
example(tzDiff)
恰好展示了这一点(尽管是在纽约和伦敦之间)。 - Dirk Eddelbuettellubridate
是导致我的解决方案有些额外开销的原因。可能可以不用它,但我的解决方案已经足够快了,我并不太在意额外的速度提升。 - RoyalTS