【问题标题】:converting time data to local time, using vector as tz in R将时间数据转换为本地时间,在 R 中使用向量作为 tz
【发布时间】:2015-12-18 14:41:29
【问题描述】:

事实上,我知道如何使用 for 循环来做到这一点,正如在下一篇文章中所讨论的那样。

Converting to Local Time in R - Vector of Timezones

但是,如果列表太长(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 条记录上,我的计算机几乎挂起。有关如何加快速度的任何线索?

【问题讨论】:

  • 我对 R 了解不多(目前),但如果你能适应 C++ 代码,你可以尝试使用更专业的库,例如 cctz。它可能会更快。

标签: r optimization timezone


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2015-09-28
    • 2020-11-25
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多