У меня возникла проблема с управлением часовыми поясами с помощью POSIXct в R. Я глобально установил для параметра TZ
значение "Europe/London"
, но, поскольку мы вернулись в GMT, выполнение as.POSIXct
больше не преобразует числовое значение. вектор обратно в нужное время.
Раскрывая, почему я обнаружил, что различия во часовом поясе могут быть вызваны типом объекта, использованным для установки даты происхождения.
Например:
# Date time is set as 1 second after 1970-01-01
as.POSIXct(1, origin = "1970-01-01")
# [1] "1970-01-01 01:00:01 BST"
# Same numeric value, but one hour less now that the origin is set using a POSIXct
as.POSIXct(1, origin = as.POSIXct("1970-01-01"))
# [1] "1970-01-01 00:00:01 BST"
Первое значение на самом деле не имеет смысла, учитывая, что запрос был взят за пределами британского летнего времени, но они были получены в GMT (см. Результаты ниже):
Sys.timezone()
# [1] "Europe/London"
Sys.time()
# [1] "2018-10-31 11:05:36 GMT"
Даже если вы явно указываете часовой пояс на каждом этапе, разница в часах сохраняется:
as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
# [1] "1970-01-01 01:00:01 BST"
as.POSIXct(1, origin = as.POSIXct("1970-01-01", tz = "Europe/London"), "Europe/London")
# [1] "1970-01-01 00:00:01 BST"
Что еще хуже, документация, полученная в результате ?as.POSIXct
, довольно расплывчата в отношении управления часовыми поясами, в частности:
Если часовой пояс необходим и указанный в вашей системе недействителен,
то, что происходит, зависит от системы, но попытки установить это, вероятно,
быть проигнорированным.
Учитывая это, у меня есть ряд вопросов:
1) Почему as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
добавляет час? Даже если дата отправления будет проанализирована как время по Гринвичу, а часовой пояс установлен явно.
2) Каков наилучший метод обеспечения согласованности вашего часового пояса в R при преобразовании из числового в R?
3) Какова лучшая практика для управления часовыми поясами в R? Есть хорошая ссылка, особенно для POSIXct
типов даты.