2017-06-17 74 views
2

我有一个包含以下日期的数据集,与其他几个人[R POSIXct返回NA与“2017年3月12日2时十七分13秒”

03/12/2017 02:17:13 

沿着我希望把整个数据集分成一个数据表,所以我用read_csvas.data.table来创建包含日期的日期/时间信息的DT。 接下来我用

DT[, date := as.POSIXct(date, format = "%m/%d/%Y %H:%M:%S")] 

一切似乎都很正常,除了我有一些NA值,其中原始数据有日期。以下表达式返回不适用

as.POSIXct("03/12/2017 02:17:13", format = "%m/%d/%Y %H:%M:%S") 

问题是为什么以及如何解决。

+0

您可能需要提供数据以向我们展示发生的情况。我的想法是,当它们是字符串时,你可能会在这些值中存在间距问题,但在我看到一些示例之前我无法确认 – akash87

+0

我怀疑这是'.Internal(as.POSIXct(x,tz))中的一个错误'。如果你追踪'as.POSIXct(x,format,tz =“America/Denver”)',它首先调用'as.POSIXlt(...)'这个工作,然后调用'as.POSIXct.POSIXlt'不。奇。 – r2evans

+0

我不认为它是我的错误或打字不当。当夏令时开始时,真的没有上午2点到3点。转到此链接(https://www.worldtimebuddy.com/united-states-colorado-denver-to-utc)并将其设置为3月12日,2017年。时钟不停地滴滴答答,但是现在凌晨3点,MDT将会是凌晨2点。 – JerryN

回答

0

我的解决方案如下,但提高赞赏的方式。

NA的解释是,在美国的山区时区,日期和时间处于切换到夏令时的窗口中,因为时间不存在,因此NA。虽然时区没有明确规定,但我猜R必须从计算机的时间,这是在“美国/丹佛”

捡起它的解决方案是明确指出日期/时间字符串是UTC,然后转换回如下:

time.utc <- as.POSIXct("03/12/2017 02:17:13", format = "%m/%d/%Y %H:%M:%S", tz = "UTC") 

> time.utc 
[1] "2017-03-12 02:17:13 UTC" 
> 

接下来,添加6小时,以UTC时间是

time.utc2 <- time.utc + 6 * 60 * 60 

> time.utc2 
[1] "2017-03-12 08:17:13 UTC" 
> 

现在使用夏令转换为美/丹佛时间UTC和MST

之间的差。

time.mdt <- format(time.utc2, usetz = TRUE, tz = "America/Denver") 

> time.mdt 
[1] "2017-03-12 01:17:13 MST" 
> 

请注意,这是标准的时候,因为夏令时不启动,直到凌晨2点。

如果从凌晨2点改变原来的字符串到凌晨3点,您会收到以下

> time.mdt 
[1] "2017-03-12 03:17:13 MDT" 
> 

2和3之间的时间是失去了从标准到夏令时的变化,但现在的数据是正确的。

2

只需使用功能anytime()utctime()从包装anytime

R> library(anytime) 
R> anytime("03/12/2017 02:17:13") 
[1] "2017-03-12 01:17:13 CST" 
R> 

R> utctime("03/12/2017 02:17:13") 
[1] "2017-03-11 20:17:13 CST" 
R> 

真正的症结在于当时没有存在于北美,由于DST。

R> utctime("03/12/2017 02:17:13", tz="UTC") 
[1] "2017-03-12 02:17:13 UTC" 
R> 

您可以表达UTC时间为山的时间,但它可以让你的前一天:

R> utctime("03/12/2017 02:17:13", tz="America/Denver") 
[1] "2017-03-11 19:17:13 MST" 
R> 

最终,你(作为UTC不观察者夏令时你可以分析它作为UTC作为分析师)必须提供什么被测量。 UTC有意义,其他可能需要调整。

相关问题