lubridate: даты разбора формы «27.10.2013 02A: 00» (переход на летнее время) - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь проанализировать строки вида 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...