首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSIXct和可变时区

POSIXct和可变时区
EN

Stack Overflow用户
提问于 2017-02-04 08:01:59
回答 2查看 231关注 0票数 0

我正在使用as.POSIXct函数处理一个大型的时间数据集(100k观察值)。

但是,时间有两个不同的时区:

代码语言:javascript
复制
"Thu Jan 17 09:29:10 EST 2013"
"Sun Mar 10 21:31:28 EDT 2013"

我试着将它们放在相同的时区和格式中,这样我就可以找到它们之间的时间距离。我这样做如下所示:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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万个案例。

EN

回答 2

Stack Overflow用户

发布于 2017-02-04 11:25:16

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

代码语言:javascript
复制
as.POSIXct(sub("E.T ", "", x), format = "%a %b %d %H:%M:%S %Y", tz = "EST5EDT")
票数 0
EN

Stack Overflow用户

发布于 2017-02-05 02:41:23

您可以使用anytime包的anytime()函数来解决此问题。

你遇到的格式在默认情况下还不支持(尽管我会补充这一点)。

然而,将其添加到当前版本0.2.0中也非常容易:

代码语言:javascript
复制
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++代码,因此性能也应该对您有所帮助:

代码语言:javascript
复制
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秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42034931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档