R POSIXct返回NA与" 03/12/2017 02:17:13"

时间:2017-06-17 16:18:09

标签: r posixct

我有一个包含以下日期的数据集以及其他几个

03/12/2017 02:17:13

我想将整个数据集放入数据表中,因此我使用read_csvas.data.table创建了DT,其中包含日期中的日期/时间信息。 接下来我用了

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

一切看起来都不错,除了我有一些原始数据有日期的NA值。以下表达式返回NA

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

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

2 个答案:

答案 0 :(得分:2)

只需使用包anytime

中的功能anytime()utctime()即可
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> 

真正的症结在于,由于夏令时,北美并不存在时间。您可以将其解析为UTC,因为UTC不会观察夏令时:

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是有意义的,其他人可能需要调整。

答案 1 :(得分:0)

我的解决方案如下,但改善的方法是赞赏的。

对NA的解释是,在美国的山区时区,该日期和时间是转换到夏令时的窗口,其中时间不存在,因此NA。虽然没有明确指定时区,但我猜R必须从计算机的时间开始,这是在" America / Denver"

解决方案是明确说明日期/时间字符串是否为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"
> 

接下来,向UTC时间添加6小时,这是UTC和MST之间的差异

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

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

现在使用夏令时转换为美国/丹佛时间。

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之间的小时丢失,但数据现在是正确的。