我正在使用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万个案例。
发布于 2017-02-04 11:25:16
如果x是输入字符矢量,请先使用sub移除时区,然后使用tz指定时区
as.POSIXct(sub("E.T ", "", x), format = "%a %b %d %H:%M:%S %Y", tz = "EST5EDT")发布于 2017-02-05 02:41:23
您可以使用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秒。
https://stackoverflow.com/questions/42034931
复制相似问题