Я пытаюсь проанализировать строки вида 25.10.2013 17:30
(часовой пояс CET / CEST, но он не указан в самих строках) как POSIXct с использованием функции lubridates dmy_hm(..., tz = 'Europe/Brussels')
.
У меня проблема в том, что после синтаксического анализа в день CEST переключается на CET (повторяется один час назад). Причина, по-видимому, заключается в том, как это изменение указано в моих данных: 02A:00
для 2-х часового CEST и 02B:00
2-х часового CET, то есть через час. dmy_hm(..., tz = 'Europe/Brussels')
интерпретирует как CET.
Минимальный рабочий пример:
> library(lubridate)
> times = c("27.10.2013 01:00", "27.10.2013 02A:00",
"27.10.2013 02B:00", "27.10.2013 03:00")
> times = dmy_hm(times, tz = "Europe/Brussels")
> times
[1] "2013-10-27 01:00:00 CEST" "2013-10-27 02:00:00 CET"
[3] "2013-10-27 02:00:00 CET" "2013-10-27 03:00:00 CET"
Мой вопрос таков: как лучше всего исправить «неправильные» даты?
Я пытался использовать which(duplicated(times))
, чтобы найти индексы повторяющихся значений и удалить один час из «неправильных» значений, однако, похоже, существует другая проблема:
> times[2] - hours(1)
[1] "2013-10-27 01:00:00 CEST"
Почему удаление одного часа из «2013-10-27 02:00:00 CET» приводит меня к «2013-10-27 01:00:00 CEST»? Разве это не прыжок двух часов? Я ожидаю приземлиться на «2013-10-27 02:00:00 CEST».
РЕДАКТИРОВАТЬ: Последняя часть является известной проблемой (см. https://github.com/tidyverse/lubridate/issues/498). Решение заключается в использовании dhours()
вместо hours()
> times[2] - dhours(1)
[1] "2013-10-27 02:00:00 CEST"