【发布时间】:2016-05-16 16:09:05
【问题描述】:
我有一个 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——在某种意义上,here 和 here 面临的逆问题——但我遇到了困难。第二个链接的解决方案的变体有效:
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 万行的 data.frame 上速度非常慢。有没有更优雅、更快捷的方法来做到这一点?
【问题讨论】: