我有一个包含以下日期的数据集以及其他几个
03/12/2017 02:17:13
我想将整个数据集放入数据表中,因此我使用read_csv
和as.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")
问题是为什么以及如何解决。
答案 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之间的小时丢失,但数据现在是正确的。