POSIXct和不同的时区

时间:2017-02-04 00:01:59

标签: r

我使用as.POSIXct函数处理大型数据集(100k观察)次数。

然而,时间有两个不同的时区:

"Thu Jan 17 09:29:10 EST 2013"
"Sun Mar 10 21:31:28 EDT 2013"

我正在尝试将它们放入相同的时区和格式,以便我可以找到它们之间的时间距离。我这样做如下:

as.POSIXct("Thu Jan 17 09:29:10 EST 2013", format="%a %b %d %H:%M:%S EST %Y")

as.POSIXct("Sun Mar 10 21:31:28 EDT 2013", format="%a %b %d %H:%M:%S EDT %Y")

我想批量进行此转换。为此,我设置了以下if函数:

mydata$converteddate = numeric(length(mydata$dates))

for (i in seq_along(mydata$converteddate)) {
  if (grepl("EST",mydata$dates[i])) mydata$converteddate[i]=as.POSIXct(mydata$dates, format="%a %b %d %H:%M:%S EST %Y")
  if (grepl("EDT",mydata$dates[i])) mydata$converteddate[i]=as.POSIXct(mydata$dates, format="%a %b %d %H:%M:%S EDT %Y")-(60*60)}

这已经持续了几个小时,看起来应该不是这样。有更快的发展吗?请注意,60 * 60部分将EDT转换为EST。

编辑:澄清一下,我的主要问题不是时区问题,而是如何以有效的方式遍历数据集以将所有日期转换为可用格式。我离开电脑5个小时,它仍在运行10万箱。

2 个答案:

答案 0 :(得分:0)

如果x是输入字符向量,请先使用sub删除时区,然后使用tz指定时区:

as.POSIXct(sub("E.T ", "", x), format = "%a %b %d %H:%M:%S %Y", tz = "EST5EDT")

答案 1 :(得分:0)

您可以使用anytime包的anytime()功能解决此问题。

默认情况下,您遇到的格式不支持 (虽然我会添加此格式)。

然而真的 很容易添加到当前版本0.2.0中:

R> library(anytime)
R> anytime::addFormats("%a %b %d %H:%M:%S% xxx %Y")  # adding it
R> anytime("Thu Jan 17 09:29:10 EST 2013")
[1] "2013-01-17 09:29:10 CST"
R> 

这里的关键是我们添加所需的格式及其'xxx'标志来隐藏时区信息。正如上面的评论已经告诉你的那样,EST和EDT只是说明性的。在这里,我们在中央时区得到CST。

性能也应该对您有帮助,因为anytime包使用了高效的C ++代码:

R> bigvec <- rep("Thu Jan 17 09:29:10 EST 2013", 100000L)
R> system.time(res <- anytime(bigvec))
   user  system elapsed 
  0.600   0.164   0.767 
R> 

在旧的低时钟速度服务器上进行100,000次转换大概3/4秒。