2015-02-05 5 views
2

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

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

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

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

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» кодом на это автоматическое значение. для петель слишком медленные

+0

Можете ли вы опубликовать свой исходный ввод 'streamflowDateTime' (до вызова' parse_Date_time' на нем), пожалуйста? – nrussell

+0

Это набор данных длиной 35034 элементов. Я не знаю, как я мог бы опубликовать это здесь. – Saadat

+0

Кроме того, я прочитал решение, которое вы опубликовали ранее. Он не работает, потому что он преобразует весь набор данных в EST. В принципе, я решил, что это поможет, если я приведу данные в виде EDT, а затем найду место, где начинается DST, и преобразует все данные с этого момента в EST! – Saadat

ответ

1

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

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

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

Это похоже на поддержку, как видно in this blog post - по крайней мере, на системах, которые предоставляют часовые пояса IANA/Olson, такие как Linux или Mac.

По the docs:

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

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

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

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

    • С 1987 по 2006 год правило было бы "EST5EDT,M4.1.0,M10.5.0". Используйте правильное правило для значений, в которых вы работаете. Если у вас есть даты, охватывающие эти периоды, вам нужно разделить их и обработать их отдельно или, если возможно, написать функцию, чтобы использовать правильное правило для данных ,

Смотрите также the timezone tag wiki.

+0

Когда я попытаюсь это сделать, все значения преобразуются в NA, а в консоли указано «Предупреждение в поле зрения Все форматы не анализируются. Не найдены форматы " – Saadat

+0

В какой ОС вы работаете? –

+0

Windows 7 Ultimate – Saadat