R конвертировать год-месяц-день-час по местному стандартному времени в UTC

Справочная информация (см. Вопрос внизу): я получал набор ежечасных усредненных наблюдений, собранных приборами на сотнях площадок в разных часовых поясах каждый час в течение последних 10 лет. Приборы никогда не настраиваются на летнее время, поэтому все время в наборе данных соответствует местному стандартному времени. Часовые значения представляют собой средние значения измерений, выполненных каждую минуту за предыдущий час. Год, месяц, день и час указываются в отдельных столбцах. Часы идут с 1:24 вместо 0:23. Я хочу создать новый столбец, содержащий дату и время UTC.

Приведенная ниже таблица данных - это образец набора данных с моим самым последним решением. В течение многих недель в течение многих разочаровывающих экспериментов я экспериментировал с strptime, chron, POXITcl и POXITlt, а также исследовал переполнение стека и другие источники, чтобы попытаться понять, каким будет решение. Я никогда не уверен в том, что происходит в моих попытках конверсии (кроме случаев, когда я уверен, что это неправильно, что происходит чаще всего!).

Я не уверен, что созданный мною столбец datetime является правильным промежуточным шагом, который я должен использовать, или как получить от него время до UTC, которое R будет обрабатывать правильно. Я вставил символ "T" между данными и временем в столбце datetime, чтобы столбец оставался символом, в противном случае происходят непредвиденные ситуации. Например, часовой пояс моей операционной системы - Америка / Торонто, и

as.POSIXct(mydata$datetime, format="%Y-%m-%dT%H:%M %z")

преобразует 2013-01-01T01: 00-0800 в 2013-01-01 04:00:00. Похоже, что приведенная выше команда конвертируется в часовой пояс моей машины, а не в UTC. Итак, если я изменю часовой пояс среды R, не меняя часовой пояс операционной системы компьютера, перед запуском команды

Sys.setenv(TZ = "GMT")
mydata$dateUTC <- as.POSIXct(mydata $datetime, format="%Y-%m-%dT%H:%M %z") 
Sys.unsetenv("TZ")

затем приведенная выше команда преобразует 2013-01-01T01: 00-0800 в 2013-01-01 09:00:00, что, по-видимому, является временем UTC, которое я ищу.

Я не слишком беспокоюсь о часе24, потому что кажется, что какой бы метод ни использовался, дата автоматически увеличивается до следующего дня, а час меняется на 00:00 (например, 2013-01-01 24:00 становится 2013-01-02 00:00).

При переходе с UTC на местное время меня не слишком беспокоит тот факт, что дата перехода на стандартное время на летнее время может изменяться с течением времени. Учитывая правильное время UTC и часовой пояс Олсона, если я использую базу данных часового пояса IANA, об этом следует позаботиться автоматически (я думаю).

Вопрос 1: Используя R, как мне преобразовать год-месяц-день-час, сообщаемый по местному стандартному времени весь год, в время UTC?

Вопрос 2: Используя R, Как я должен преобразовать время UTC в местное стандартное время (без преобразования в летнее время в населенных пунктах, которые используют летнее время для гражданского времени)?

Вопрос 3: Используя R, как я должен конвертировать время из UTC в местное время с учетом летнего времени?

Вопрос 4: Чтобы преобразовать UTC в местное время, мне понадобятся имена часовых поясов из базы данных IANA. Есть ли какой-нибудь способ, которым я могу получить это откуда-нибудь в Интернете, учитывая широту и долготу для каждого сайта?

filename = mydata
    site    year  month day hourend UTCoffset      datetime         obs
    2001    2015    1   1   22:00   -0200   2013-01-01T22:00-0200   1356
    2001    2015    1   1   23:00   -0200   2013-01-01T23:00-0300   1593
    2001    2015    1   1   24:00   -0200   2013-01-01T24:00-0200   946
    2001    2015    1   2   01:00   -0200   2013-01-02T01:00-0200   271
    2001    2015    1   2   02:00   -0200   2013-01-02T02:00-0200   665
    3001    2015    1   1   22:00   -0350   2013-01-01T22:00-0350   548
    3001    2015    1   1   23:00   -0350   2013-01-01T23:00-0350   936
    3001    2015    1   1   24:00   -0350   2013-01-01T24:00-0350   1938
    3001    2015    1   2   01:00   -0350   2013-01-02T01:00-0350   952
    3001    2015    1   2   02:00   -0350   2013-01-02T02:00-0350   1584
    4001    2015    1   1   22:00   -0400   2013-01-01T22:00-0400   1837
    4001    2015    1   1   23:00   -0400   2013-01-01T23:00-0400   1275
    4001    2015    1   1   24:00   -0400   2013-01-01T24:00-0400   382
    4001    2015    1   2   01:00   -0400   2013-01-02T01:00-0400   837
    4001    2015    1   2   02:00   -0400   2013-01-02T02:00-0400   592
    5001    2015    1   1   22:00   -0500   2013-01-01T22:00-0500   392
    5001    2015    1   1   23:00   -0500   2013-01-01T23:00-0500   15
    5001    2015    1   1   24:00   -0500   2013-01-01T24:00-0500   403
    5001    2015    1   2   01:00   -0500   2013-01-02T01:00-0500   993
    5001    2015    1   2   02:00   -0500   2013-01-02T02:00-0500   1287
    6001    2015    1   1   22:00   -0600   2013-01-01T22:00-0600   738
    6001    2015    1   1   23:00   -0600   2013-01-01T23:00-0600   992
    6001    2015    1   1   24:00   -0600   2013-01-01T24:00-0600   1392
    6001    2015    1   2   01:00   -0600   2013-01-02T01:00-0600   189
    6001    2015    1   2   02:00   -0600   2013-01-02T02:00-0600   1282
    7001    2015    1   1   22:00   -0700   2013-01-01T22:00-0700   839
    7001    2015    1   1   23:00   -0700   2013-01-01T23:00-0700   742
    7001    2015    1   1   24:00   -0700   2013-01-01T24:00-0700   942
    7001    2015    1   2   01:00   -0700   2013-01-02T01:00-0700   882
    7001    2015    1   2   02:00   -0700   2013-01-02T02:00-0700   993
    8001    2015    1   1   22:00   -0800   2013-01-01T22:00-0800   1140
    8001    2015    1   1   23:00   -0800   2013-01-01T23:00-0800   1532
    8001    2015    1   1   24:00   -0800   2013-01-01T24:00-0800   1834
    8001    2015    1   2   01:00   -0800   2013-01-02T01:00-0800   1732
    8001    2015    1   2   02:00   -0800   2013-01-02T02:00-0800   954

1 ответ

Вы можете проверить пакет "Lubridate" в R. Функция strptime будет полезна для вашего случая.

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