我使用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万箱。
答案 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秒。