润滑 yyyy-MM-dd'T'HH:mm:ssX 转换意外。漏洞?

rag*_*lpr 3 r lubridate

解析“yyyy-MM-dd'T'HH:mm:ssX”字符串时非常意外的行为(ISO 8601)

> as_datetime("2017-03-22T15:48:00.000Z")
[1] "2017-03-21 23:00:00 UTC"

> packageDescription("lubridate")$Version 
[1] "1.6.0"
Run Code Online (Sandbox Code Playgroud)

有人可以解释这样做的理由吗?

编辑:似乎是一个错误,请参阅问题 #536

Ben*_*ker 5

更新:在此处lubridate提交解决(2017 年 5 月)。适用于1.7.4,可能也适用于一些早期版本。lubridate

在不深入研究 的情况下as_datetime,我认为这可能是 (1)as_datetime 无法处理(即忽略)T您的格式的组合;(2)从本地到UTC时区的转换。

dstr <- "2017-03-22T15:48:00.000Z"
library(lubridate)
as_datetime(dstr)
## [1] "2017-03-22 04:00:00 UTC"
Run Code Online (Sandbox Code Playgroud)

如果as_datetime()忽略之后的所有内容T ,我们将在 2017-03-22 进入午夜。但是,这被视为我当地时区的午夜,即 GMT+04,因此结果时间为 04:00:00。大概您的当地时间是 GMT-01。

如果你手动替换一个空间让T事情更好地工作(stringr::str_replace如果你愿意,你可以使用 )

as_datetime(sub("T"," ",dstr))
## [1] "2017-03-22 19:48:00 UTC"
Run Code Online (Sandbox Code Playgroud)

或使用strptime

strptime(dstr,format="%Y-%m-%dT%H:%M:%S")
## [1] "2017-03-22 15:48:00 EDT"
Run Code Online (Sandbox Code Playgroud)

(注意strptime自动丢弃尾随字符)

对于 Dirk Eddelbuettel 的anytime包处理这种情况的价值:

 anytime(dstr)
 ## [1] "2017-03-22 15:48:00 EDT"
Run Code Online (Sandbox Code Playgroud)


Sar*_*ina 5

如果您以此处提供的格式导入数据,并且想使用 lubridate 将其转换为日期时间对象,我建议您使用ymd_hmslubridate 函数。

在您的情况下,它看起来像这样:

ymd_hms("2017-03-22T15:48:00.000Z")
[1] "2017-03-22 15:48:00 UTC"
Run Code Online (Sandbox Code Playgroud)