Преобразование часовых поясов во временных рядах

Я ввел временной ряд в R, используя функцию parse_date_time в библиотеке (lubridate), и я ввел его как EST.

streamflowDateTime<-parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="EST")

Однако данные переходят на летнее время 03.04.2005 в 01:45, а следующий временной шаг — 03:00. Я хочу преобразовать это событие и все последующие метки времени в EST, вычитая час, чтобы оно было непрерывным. Было бы предпочтительнее, если бы был автоматизированный способ сделать это, когда программа определяет, где начинается переход на летнее время, и сама перемещается на час назад, поскольку летнее время не вступает в силу каждый год в один и тот же день в одно и то же время.

Вот пример данных

structure(c(1112475600, 1112476500, 1112477400, 1112478300, 1112479200, 
1112480100, 1112481000, 1112481900, 1112482800, 1112483700, 1112484600, 
1112485500, 1112486400, 1112487300, 1112488200, 1112489100, 1112490000, 
1112490900, 1112491800, 1112492700, 1112493600, 1112494500, 1112495400, 
1112496300, 1112497200, 1112498100, 1112499000, 1112499900, 1112500800, 
1112501700, 1112502600, 1112503500, 1112504400, 1112505300, 1112506200, 
1112507100, 1112508000, 1112508900, 1112509800, 1112510700, 1112515200, 
1112516100, 1112517000, 1112517900, 1112518800, 1112519700, 1112520600, 
1112521500, 1112522400, 1112523300, 1112524200, 1112525100, 1112526000, 
1112526900, 1112527800, 1112528700, 1112529600, 1112530500, 1112531400, 
1112532300, 1112533200, 1112534100, 1112535000, 1112535900, 1112536800, 
1112537700, 1112538600, 1112539500, 1112540400, 1112541300, 1112542200, 
1112543100, 1112544000, 1112544900, 1112545800, 1112546700, 1112547600, 
1112548500, 1112549400, 1112550300, 1112551200, 1112552100, 1112553000, 
1112553900, 1112554800, 1112555700, 1112556600, 1112557500, 1112558400, 
1112559300, 1112560200, 1112561100, 1112562000, 1112562900, 1112563800, 
1112564700, 1112565600, 1112566500, 1112567400, 1112568300, 1112569200
), class = c("POSIXct", "POSIXt"), tzone = "EST")

Редактирует:

streamflowDateTime[8840:length(streamflowDateTime)] <- streamflowDateTime[8840:length(streamflowDateTime)]-hours(1)

В полном наборе данных событие происходит в месте 8840, которое я знаю вручную, я хочу, чтобы код автоматически находил положение, в котором разница во времени между двумя последовательными отметками времени не составляет 15 минут, и заменял «8840» в коде на это автоматизированное значение. циклы слишком медленные


person Saadat    schedule 05.02.2015    source источник
comment
Можете ли вы опубликовать свой исходный ввод streamflowDateTime (до вызова parse_Date_time), пожалуйста?   -  person nrussell    schedule 05.02.2015
comment
Это набор данных длиной 35034 элемента, я не знаю, как я смогу опубликовать это здесь.   -  person Saadat    schedule 05.02.2015
comment
Кроме того, я прочитал решение, которое вы разместили ранее. Это не работает, потому что преобразует весь набор данных в EST. По сути, я подумал, что было бы лучше, если бы я ввел данные как EDT, а затем нашел место, где начинается переход на летнее время, и преобразовал все данные с этой точки в EST!   -  person Saadat    schedule 05.02.2015
comment
Просто разместите сегмент, соответствующий указанному выше вектору, или хотя бы несколько его элементов. Мне в основном просто нужно увидеть формат входного (символьного) вектора.   -  person nrussell    schedule 05.02.2015
comment
Да, я удалил его, потому что неправильно истолковал ваш вопрос. Просмотр исходных данных поможет мне прояснить проблему.   -  person nrussell    schedule 05.02.2015
comment
Исходный класс данных = фактор и выглядит так   -  person Saadat    schedule 05.02.2015
comment
Также я отредактировал исходный пост выше, пожалуйста, прочитайте его внизу   -  person Saadat    schedule 05.02.2015


Ответы (1)


Вероятно, вы можете просто указать полный идентификатор часового пояса IANA America/New_York вместо аббревиатуры часового пояса.

parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="America/New_York")

Использование America/New_York будет правильно учитывать как EST, так и EDT, включая правильные переходы между ними.

Похоже, это поддерживается, как видно в этом сообщении блога — по крайней мере, в системах, которые предоставляют часовые пояса IANA/Olson, таких как Linux или Mac.

Согласно документации:

... R не поставляется с предопределенным списком имен зон, но полагается на операционную систему пользователя для интерпретации имен часовых поясов. В результате некоторые имена будут распознаваться на одних компьютерах, но не на других. Однако большинство компьютеров распознают имена в базе данных часовых поясов, первоначально составленной Артуром Олсоном. Эти названия обычно имеют форму «Страна/Город». ...

Поскольку Windows использует собственный набор часовых поясов, вы, вероятно, не сможете использовать идентификаторы IANA/Olson. Однако:

  • Эквивалентный идентификатор часового пояса Windows будет "Eastern Standard Time". (Несмотря на название, это касается как EST, так и EDT). Я не уверен, поддерживает ли R их или нет.

  • Полным часовым поясом POSIX для текущего правила будет "EST5EDT,M3.2.0,M11.1.0". Это должно работать на всех ОС, однако после изменения 2007 года оно представляет только восточный часовой пояс США.

    • From 1987-2006 the rule would have been "EST5EDT,M4.1.0,M10.5.0". Use the appropriate rule for the values you're working in. If you have dates that span these periods, you'll need to split them up and process them separately, or if possible, write a function to use the correct rule for the data.

См. также вики тега часового пояса.

person Matt Johnson-Pint    schedule 05.02.2015
comment
Когда я пытаюсь это сделать, все значения преобразуются в NA, а в консоли отображается сообщение «Предупреждение». Все форматы не удалось проанализировать. Форматы не найдены - person Saadat; 06.02.2015
comment
На какой ОС вы работаете? - person Matt Johnson-Pint; 06.02.2015
comment
Обновил ответ. Надеюсь, это поможет. - person Matt Johnson-Pint; 06.02.2015