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 будет полезна для вашего случая.