【发布时间】:2015-10-12 11:47:42
【问题描述】:
我想将具有不同时区的多个时间值(目前以 1970 年 1 月 1 日以来的毫秒数表示)转换为 POSIXct 格式。
我有以下数据集:
times <- c(1427450400291, 1428562800616, 1418651628795, 1418651938990, 1418652348281, 1418652450161)
tzones <- c("America/Los_Angeles", "Africa/Casablanca", "Africa/Casablanca", "Africa/Casablanca", "Africa/Casablanca", "Israel Standard Time")
问题是as.POSIXct 方法只接受一个 tz 值,而不是一个向量。因此,我不能直接调用它。我尝试使用 lapply 并逐个元素地调用它,但这需要很长时间(对于更长的向量):
get.dates.with.timezones <- function(epoch.vec,tz.vec) {
res <- lapply(seq(epoch.vec),function(x){
as.POSIXct(epoch.vec[x]/1000,origin = "1970-01-01", tz = tz.vec[x])
})
return(do.call(c,res))
}
所以只有 1200 个值,几乎需要一秒钟。
timesX200 <- rep(times,200)
tzonesX200 <- rep(tzones,200)
system.time( get.dates.with.timezones(timesX200,tzonesX200) )
user system elapsed
0.86800000000005184 0.01999999999999602 0.88899999999921420
我是 R 的新手,所以我想知道是否有办法提高这项任务的性能。这个问题有矢量化选项吗?此外,as.POXIXct() 方法本身似乎存在一些性能问题,如 here 所示。
--------- 编辑 --------
显然不可能保存具有不同时区的 POSIXct 向量。来自 POSIXct 文档:
在“POSIXlt”对象上使用 c 会将它们转换为当前时区, 并且在“POSIXct”对象上删除任何“tzone”属性(即使它们 都标有相同的时区)。 Source
那太糟糕了。我想知道是否有任何替代方法来处理日期+时间+不同的时区。如果有的话会很高兴。
【问题讨论】:
-
我会试试
lubridate包中的时间函数,它们比as.POSIXct高效得多。 -
@Paul Hiemstra 谢谢。我查看了
lubridate,但找不到我正在寻找的方法。