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"
Может ли кто-нибудь объяснить обоснование этого?
редактировать: похоже на ошибку, см. вопрос № 536
2 ответа
Не копаясь в кишках 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"
Если 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"
Или использовать strptime
:
strptime(dstr,format="%Y-%m-%dT%H:%M:%S")
## [1] "2017-03-22 15:48:00 EDT"
(Обратите внимание, что strptime
автоматически отбрасывает конечные символы)
За что стоит Дирк Эддельбюттель anytime
пакет обрабатывает этот случай:
anytime(dstr)
## [1] "2017-03-22 15:48:00 EDT"
Если вы импортировали данные в представленном здесь формате и хотите использовать lubridate для преобразования их в объект даты и времени, я бы порекомендовал использовать ymd_hms
функция смазки.
В вашем случае это будет выглядеть так:
ymd_hms("2017-03-22T15:48:00.000Z")
[1] "2017-03-22 15:48:00 UTC"