separar - ¿Cómo extraer las zonas horarias correctas de los objetos POSIXct y POSIXlt?
secuencia de fechas en r (3)
1 / ¿Cuál es la diferencia entre los formatos POSIXct y POSIXlt?
-
POSIXct
es segundos desde la época. -
POSIXlt
divide losPOSIXlt
en%Y-%m-%d
o%Y/%m/%d %H:%M:%S
u otros formatos similares
time1 = as.POSIXlt("2010-07-01 16:00:00", tz="Europe/London")
time1
# [1] "2010-07-01 16:00:00 Europe/London"
pero
time2 = as.POSIXct("2010-07-01 16:00:00", tz="Europe/London")
time2
# [1] "2010-07-01 16:00:00 BST"
¿Por qué la zona horaria se presenta de manera diferente? Es importante para mí porque necesito extraer las zonas horarias de mi fecha.
base::format(time1, format="%Z")
# [1] "BST"
base::format(time2, format="%Z")
# [1] "BST"
ambos dan el mismo "BST" para British Saving Time!
El problema es que "BST" no tiene que ser reconocido por el formato POSIXct / POSIXlt:
as.POSIXlt("2010-07-01 16:00:00", tz="BST")
# [1] "2010-07-01 16:00:00 BST"
# Warning messages:
# 1: In strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
# unknown timezone ''BST''
# 2: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
# unknown timezone ''BST''
# 3: In strptime(x, f, tz = tz) : unknown timezone ''BST''
as.POSIXct("2010-07-01 16:00:00", tz="BST")
# [1] "2010-07-01 16:00:00 GMT"
# Warning messages:
# 1: In strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
# unknown timezone ''BST''
# 2: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
# unknown timezone ''BST''
# 3: In strptime(x, f, tz = tz) : unknown timezone ''BST''
# 4: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
# unknown timezone ''BST''
# 5: In as.POSIXlt.POSIXct(x, tz) : unknown timezone ''BST''
Estoy realmente confundido. Tengo 2 preguntas:
1 / ¿Cuál es la diferencia entre los formatos POSIXct y POSIXlt?
2 / ¿Alguien sabe qué zona horaria puedo usar?
"Europa / Londres" funciona con POSIXlt pero no con POSIXct. Además, no se puede extraer de un momento utilizando base :: format
"BST" no se reconoce como una zona horaria válida en las funciones as.POSIXct
o as.POSIXlt
.
@Koshke ya te mostró
- la diferencia en la representación interna de ambos tipos de fecha, y
- Que internamente, ambas especificaciones de zona horaria son las mismas.
Puede obtener la zona horaria de forma estandarizada utilizando attr()
. Esto obtendrá la zona horaria en la forma especificada en el archivo zone.tab
, que es usado por R para definir las zonas horarias (Más información en ?timezones
).
p.ej :
> attr(time1,"tzone")
[1] "Europe/London"
> attr(time2,"tzone")
[1] "Europe/London"
Sin embargo, estoy bastante sorprendido de que POSIXct use diferentes indicaciones para las zonas horarias que POSIXlt, mientras que los atributos son iguales. Aparentemente, este "BST" solo aparece cuando se imprime el POSIXct. Antes de que se imprima, POSIXct se convierte nuevamente a POSIXlt, y el atributo tzone se modifica con sinónimos:
> attr(as.POSIXlt(time2),"tzone")
[1] "Europe/london" "GMT" "BST"
Esto sucede en algún lugar corriente abajo de la función interna de R como as.POSIXlt
, que no puedo ver por el momento debido a problemas más graves que resolver. Pero siéntase libre de pasar por esto y ver qué es exactamente lo que está sucediendo allí.
En una nota al margen, "BST" no se reconoce como una zona horaria (y tampoco se menciona en zone.tab) en mi instalación de Windows 7 / R 2.13.0.
Quizás, unclass
los objetos te ayuda a inspeccionar las diferencias:
> unclass(time1)
$sec
[1] 0
$min
[1] 0
... snip
$yday
[1] 181
$isdst
[1] 1
attr(,"tzone")
[1] "Europe/London"
> unclass(time2)
[1] 1277996400
attr(,"tzone")
[1] "Europe/London"
por lo tanto, POSIXlt contiene la fecha como una lista de componentes, mientras que POSIXct la contiene como un número, es decir, el tiempo de la época de UNIX.
En cuanto a la zona horaria, estaría fuera del alcance de R.
Vea la explicación en http://en.wikipedia.org/wiki/Tz_database
En cuanto al comportamiento diferente de
as.POSIXct("2010-07-01 16:00:00", tz="BST")
as.POSIXlt("2010-07-01 16:00:00", tz="BST")
Sospecho que hay un error en as.POSIXct, que no procesa el argumento tz.