我正在使用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 回答
如果
x
是输入字符向量,请首先使用sub
删除时区并使用tz
指定它:您可以使用anytime包的
anytime()
函数解决此问题 .默认情况下尚不支持您遇到的格式(尽管我会添加此格式) .
但是,添加到当前版本0.2.0也很容易:
这里的关键是我们添加所需的格式及其“xxx”标志来隐藏时区信息 . 正如上面的评论已经告诉你的那样,EST和EDT只是说明性的 . 在这里,我们在中央时区获得CST .
性能也应该对您有所帮助,因为anytime包使用了高效的C代码:
在我较旧的低时钟速度服务器上进行100,000次转换大约需要3/4秒 .