У меня была аналогичная проблема с гидрологическими данными с датчика. Мои метки времени были в формате 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