Преобразование данных времени в местное время, используя вектор как tz в R
На самом деле я знаю, как это сделать, используя цикл for, как обсуждалось в следующем посте.
Преобразование в местное время в R - Вектор часовых поясов
Однако, если список слишком длинный (500 000 записей), вычисление занимает вечность. Есть лучший способ сделать это?
Мои данные (DF) в символьном формате. Это выглядит так:
raw_date timezoneID
2012-07-01 01:41:48 America/Montreal
2012-07-01 01:41:55 America/Edmonton
2012-07-01 08:26:07 America/Montreal
2012-07-01 09:26:08 America/Toronto
2012-07-01 10:29:05 America/Toronto
2012-07-01 10:39:20 America/Toronto
Вот что я делаю:
tmp_time <- data.frame(EST_date = as.POSIXct(df$raw_date, tz="EST"), TZID = df$timezoneID)
tmp_time$TZID <- as.character(tmp_time$TZID)
local_time <- vector()
for (i in (1:nrow(tmp_time))){
local_time[i] <- (format(tmp_time$EST_date[i], tz=tmp_time$TZID[i],usetz = TRUE, "%Y-%m-%d %H:%M:%S"))
}
local_time
# [1] "2012-07-01 02:41:48 EDT" "2012-07-01 00:41:55 MDT"
# [3] "2012-07-01 09:26:07 EDT" "2012-07-01 10:26:08 EDT"
# [5] "2012-07-01 11:29:05 EDT" "2012-07-01 11:39:20 EDT"
Как я уже сказал, вышеупомянутое решение работает, но оно очень медленное, и на 500 000 записей мой компьютер почти зависает. Любые подсказки о том, как ускорить это?
1 ответ
Решение
library(dplyr)
tmp_time %>% group_by(TZID) %>%
mutate(tm=format(EST_date, tz=unique(TZID),
usetz = TRUE, "%Y-%m-%d %H:%M:%S"))
# Source: local data frame [6 x 3]
# Groups: TZID [3]
# EST_date TZID tm
# (time) (chr) (chr)
# 1 2012-07-01 01:41:48 America/Montreal 2012-07-01 02:41:48 EDT
# 2 2012-07-01 01:41:55 America/Edmonton 2012-07-01 00:41:55 MDT
# 3 2012-07-01 08:26:07 America/Montreal 2012-07-01 09:26:07 EDT
# 4 2012-07-01 09:26:08 America/Toronto 2012-07-01 10:26:08 EDT
# 5 2012-07-01 10:29:05 America/Toronto 2012-07-01 11:29:05 EDT
# 6 2012-07-01 10:39:20 America/Toronto 2012-07-01 11:39:20 EDT