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"
Другие вопросы по тегам