首页 文章

POSIXct和不同的时区

提问于
浏览
0

我正在使用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

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

    as.POSIXct(sub("E.T ", "", x), format = "%a %b %d %H:%M:%S %Y", tz = "EST5EDT")
    
  • 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秒 .

相关问题