verano - zona horaria europa
La conversión de caracteres POSIXct en R causa valores de zona horaria incorrectos en la transición del horario de verano(CEST/CET)) (1)
Tengo un problema al convertir POSIXct a carácter y luego a POSIXct en R. Ejecuto el siguiente código:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- as.character(time_seq_01)
time_seq_03 <- as.POSIXct(time_seq_02)
o equivalente:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- format(time_seq_01,usetz = TRUE)
time_seq_03 <- as.POSIXct(time_seq_02)
Estas son las marcas de tiempo en 2012 cuando se produce la transición del horario de verano del horario de verano de Europa Central (CEST) al horario de Europa Central (último domingo de octubre de 02:00 a 03:00).
Cuando llamo a estos elementos obtengo
time_seq_01
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST"
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET"
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET"
time_seq_02
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST"
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET"
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET"
time_seq_03
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CET"
[5] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[7] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET"
La creación de una secuencia POSIXct funciona correctamente ( time_seq_01
) y la transición al carácter también ( time_seq_02
). Sin embargo, la transición de regreso del carácter a POSIXct produce valores de zona horaria (CET / CEST) time_seq_03
( time_seq_03
). Esto se puede ver claramente cuando esos elementos están ordenados:
sort(time_seq_01)
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST"
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET"
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET"
sort(time_seq_03)
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:00:00 CEST"
[3] "2012-10-28 02:15:00 CEST" "2012-10-28 02:15:00 CEST"
[5] "2012-10-28 02:30:00 CEST" "2012-10-28 02:30:00 CEST"
[7] "2012-10-28 02:45:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET"
Esto causa una serie de problemas, por ejemplo, al combinar objetos por esas marcas de tiempo. ¿Hay alguna manera de superar este problema?
El sistema que utilizo:
Windows 7 64bit
R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=German_Austria.1252 LC_CTYPE=German_Austria.1252
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C
[5] LC_TIME=German_Austria.1252
attached base packages:
[1] tools stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] pkgtools_0.1-3 roxygen2_2.2.2 digest_0.5.2 rj_1.1.0-4
loaded via a namespace (and not attached):
[1] brew_1.0-6 plyr_1.7.1 rj.gd_1.1.0-1 stringr_0.6.1
A continuación, se presenta una POSIXct
que va de POSIXct
a character
nuevo a POSIXct
conservando el estado original del horario de verano.
Sys.setenv(TZ=''Europe/Berlin'') # to reproduce OP''s example
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- format(time_seq_01,usetz = TRUE)
time_seq_02_lt <- as.POSIXlt(time_seq_02)
time_seq_02_lt$isdst <- as.POSIXlt(time_seq_01)$isdst
time_seq_03 <- as.POSIXct(time_seq_02_lt)
Por lo que puedo decir, el soporte de R para string-dat-datetime no incluye indicadores DST especificados dentro de las cadenas.