Обработка дат при переходе на летнее время и обратно

Я хотел бы использовать R для анализа временных рядов. Я хочу сделать модель временного ряда и использовать функции из пакетов timeDate и прогноз.

У меня есть внутридневные данные в часовом поясе CET (данные за 15 минут, 4 точки данных в час). 31 марта вводится летнее время, и мне не хватает 4 точек данных из 96, которые у меня обычно есть. 28 октября у меня 4 точки данных слишком много, так как время переключается назад.

Для моей модели временных рядов мне всегда нужно 96 точек данных, иначе внутридневная сезонность испортится.

Есть ли у вас опыт в этом? Знаете ли вы функцию R или пакет, который помог бы автоматизировать такую ​​обработку данных — что-то элегантное? Спасибо!


person Richard    schedule 13.12.2012    source источник


Ответы (3)


У меня была аналогичная проблема с гидрологическими данными с датчика. Мои метки времени были в формате UTC+1 (CET) и не переключались на летнее время (UTC+2, CEST). Поскольку я не хотел, чтобы мои данные отличались на один час (что было бы в случае использования UTC), я взял спецификацию преобразования %z strptime. В ?strptime вы найдете:

%z Смещение со знаком в часах и минутах от UTC, поэтому -0800 на 8 часов отстает от UTC.

Например: в 2012 году переход со стандартного времени на летнее время произошел 25 марта 2012 года, поэтому в этот день нет 02:00. Если вы попытаетесь преобразовать "2012-03-25 02:00:00" в объект POSIXct,

> as.POSIXct("2012-03-25 02:00:00", tz="Europe/Vienna")
[1] "2012-03-25 CET"

вы не получаете ошибку или предупреждение, вы просто получаете дату без времени (это поведение задокументировано).

Использование format = "%z" дает желаемый результат:

> as.POSIXct("2012-03-25 02:00:00 +0100", format="%F %T %z", tz="Europe/Vienna")
[1] "2012-03-25 03:00:00 CEST"

Чтобы облегчить этот импорт, я написал небольшую функцию с соответствующими значениями по умолчанию:

as.POSIXct.no.dst <- function (x, tz = "", format="%Y-%m-%d %H:%M", offset="+0100", ...)
{
  x <- paste(x, offset)
  format <- paste(format, "%z")
  as.POSIXct(x, tz, format=format, ...)
}

> as.POSIXct.no.dst(c("2012-03-25 00:00", "2012-03-25 01:00", "2012-03-25 02:00", "2012-03-25 03:00"))
[1] "2012-03-25 00:00:00 CET"  "2012-03-25 01:00:00 CET"  "2012-03-25 03:00:00 CEST"
[4] "2012-03-25 04:00:00 CEST"
person Tobias    schedule 13.12.2012
comment
Итак, когда вы читаете данные с помощью своей функции, у вас будет одинаковое количество точек данных для каждого дня, тогда как при использовании as.POSIXct не было бы. Мне трудно понять, как это помогает. - person GSee; 14.12.2012
comment
@GSee, вы абсолютно правы, мой ответ не решает проблему разного количества наблюдений в день. Но если @Richard также заинтересован в регулярном сериале, это может быть полезно. Например: time <- paste("2012-10-", rep(27:29, each=24), " ", 0:23, ":00", sep=""). Импорт с помощью diff(as.POSIXct(time)) дает неправильный ts, тогда как diff(as.POSIXct.no.dst(time)) дает обычный. - person Tobias; 14.12.2012
comment
Если вам вообще не нужны часовые пояса, вам следует рассмотреть возможность использования класса POSIXlt, с которым вы также получите обычный временной ряд diff(strptime(time, format="%F %H:%M")). Я нашел статью (стр. 29ff) в R-News 2004/1 полезной. ссылка - person Tobias; 14.12.2012

Если вы не хотите переходить на летнее время, преобразуйте его в часовой пояс, в котором его нет (например, GMT, UTC).

times <- .POSIXct(times, tz="GMT")
person Joshua Ulrich    schedule 13.12.2012
comment
Это мне не помогает. Я хочу посмотреть на внутридневные паттерны, которые запускаются по местному времени. Например, люди идут на работу в 08:00 по местному времени (это CET зимой и CEST летом). Делая это, я проигрываю и выигрываю один час соответственно, и мне было интересно, как люди решают это. Спасибо за комментарий в любом случае. - person Richard; 14.12.2012

Вот получение смещения летнего времени - например. Центральное летнее время

> Sys.time()

"2015-08-20 07:10:38 CDT" # Я нахожусь в Америке/Чикаго, дневное время.

> as.POSIXct(as.character(Sys.time()), tz="America/Chicago")

"2015-08-20 07:13:12 CDT"

> as.POSIXct(as.character(Sys.time()), tz="UTC") - as.POSIXct(as.character(Sys.time()), tz="America/Chicago")

Разница во времени -5 часов

> as.integer(as.POSIXct(as.character(Sys.time()), tz="UTC") - as.POSIXct(as.character(Sys.time()), tz="America/Chicago"))

-5

Некоторое вдохновение было от

Преобразование часовых поясов в R: советы, рекомендации и подводные камни

person Andre Mikulec    schedule 20.08.2015