Базовый тип происхождения posixct вызывает различия часовых поясов

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

If a time zone is needed and that specified is invalid on your system, what happens is system-specific but attempts to set it will probably be ignored.

Учитывая это, у меня есть ряд вопросов:

1) Почему as.POSIXct(1, origin = "1970-01-01", tz = "Europe/London") добавляет час? Даже если дата происхождения будет анализироваться как время по Гринвичу и часовой пояс установлен явно.

2) Каков наилучший метод обеспечения согласованности вашего часового пояса в R при преобразовании из числового в R?

3) Как лучше всего управлять часовыми поясами в R? Есть ли хорошая ссылка, особенно для типов даты POSIXct.

Был бы признателен, если в каких-либо ответах не используется lubridate, поскольку он импортирует stringi через stringr, что в некоторых случаях может быть проблематичным.

Glen Moutrie 31.10.2018 12:49
4
1
174
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Это потому, что в 1970 году Великобритания была целым годом на BST. Фактически, Великобритания была на BST с 18 февраля 1968 по 31 октября 1971 года. Это означает, что R верен, возвращая «1970-01-01 01:00:01 BST», когда вы указываете часовой пояс для «Europe / London». См. Дополнительную информацию о эта страница в Википедии.

Раз:

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 для науки о данных вот ТАК сообщать о часовых поясах

Спасибо, действительно помогли. Похоже, Великобритания решила, что лето любви было настолько хорошим, что следующее лето продлилось четыре года ...

Glen Moutrie 31.10.2018 14:45

Выяснил, почему Великобритания осталась в BST. Интересное чтение, если вы регулярно занимаетесь этим: bbc.co.uk/news/uk-scotland-11643098

Glen Moutrie 31.10.2018 14:52

Другие вопросы по теме