Базовый тип происхождения POSIXct вызывает различия часовых поясов - PullRequest
0 голосов
/ 31 октября 2018

У меня возникла проблема с управлением часовыми поясами с помощью 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 типов даты.

1 Ответ

0 голосов
/ 31 октября 2018

У вас есть небольшая история здесь для вопроса 1. См. Ниже все результаты для BST, GMT и UTC. UTC и GMT должны быть (и есть) одинаковыми. Теперь, почему вы получаете BST с первой строкой кода?

Это потому, что в 1970 году в Великобритании весь год проводился BST. На самом деле, Великобритания была на BST с 1968-02-18 по 1971-10-31. Это означает, что R правильно, возвращая "1970-01-01 01:00:01 BST", когда вы указали часовой пояс для "Европа / Лондон". Для получения дополнительной информации о этой странице википедии см. .

Times:

as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London")
[1] "1970-01-01 01:00:01 BST"
as.POSIXct(1, origin = "1970-01-01", tz = "GMT")
[1] "1970-01-01 00:00:01 GMT"
as.POSIXct(1, origin = "1970-01-01", tz = "UTC")
[1] "1970-01-01 00:00:01 UTC"

Q2: Сначала вам нужно узнать, из какого часового пояса взяты даты. Затем продолжайте работать в этом часовом поясе или измените часовой пояс на свой местный часовой пояс. Или удалите часовой пояс объекта даты и времени, который заставит все к UTC.

Я бы сказал, что lubridate force_tz и with_tz функционируют для принудительного использования часовых поясов. Но так как вы не хотите lubridate, либо установите свой местный часовой пояс на то, что вам нужно. Я склонен использовать Sys.setenv(TZ = "UTC"), если я работаю со складскими данными, чтобы объекты xts не жаловались, когда у меня другое местное время.

Q3: здесь немного от R для Data Science вот ТАК сообщение о часовых поясах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...