tutorial studio ggplot espaƱol descargar barplot r date posixct

studio - seq() para POSIXct



ggplot2 tutorial (6)

Mi objetivo es crear un vector de marcas de tiempo POSIXct dado un comienzo, un final y un delta (15min, 1 hora, 1 día). Esperaba poder usar seq para esto, pero tengo un problema al convertir la representación numérica y POSIXct:

now <- Sys.time() now # [1] "2012-01-19 10:30:39 CET" as.POSIXct(as.double(now), origin="1970-01-01", tz="CET") # [1] "2012-01-19 09:30:39 CET" as.POSIXct(as.double(now), origin=as.POSIXct("1970-01-01", tz="CET"), tz="CET") # [1] "2012-01-19 09:30:39 CET"

Una hora se pierde durante esta conversión. ¿Qué estoy haciendo mal?


Debe tener en cuenta que al convertir de POSIXct a numérico, R toma en cuenta la zona horaria pero siempre comienza a contar desde un origen GMT:

> xgmt <- as.POSIXct(''2011-01-01 14:00:00'',tz=''GMT'') > xest <- as.POSIXct(''2011-01-01 14:00:00'',tz=''EST'') > (as.numeric(xgmt) - as.numeric(xest)) / 3600 [1] -5

Como puede ver, el tiempo en EST está concebido para ser cinco horas antes que en GMT, que es la diferencia horaria entre ambas zonas horarias. Es ese valor que se guarda internamente.

La función as.POSIXCT() solo agrega un atributo que contiene la zona horaria. No altera el valor, por lo que obtiene el tiempo presentado en tiempo GMT, pero con un atributo que indica que es EST. Esto también significa que una vez que pase de POSIXct a numérico, debe tratar sus datos como si fuera la hora GMT. (Es mucho más complejo que eso, pero es la idea general). Entonces tienes que calcular el offset de la siguiente manera:

> nest <- as.numeric(xest) > origin <- as.POSIXct(''1970-01-01 00:00:00'',tz=''EST'') > offset <- as.numeric(origin) > as.POSIXct(nest-offset,origin=origin) [1] "2011-01-01 14:00:00 EST"

Esto funciona independientemente de la zona horaria en su localidad (en mi caso, eso es en realidad CET). También tenga en cuenta que el comportamiento de los datos de la zona horaria puede diferir entre los sistemas.


Debe usar seq (desde = inicio, hasta = final, por = paso). Tenga en cuenta que en el paso puede usar "días" o un número entero que define cuántos segundos transcurren de un elemento a otro.


Estos problemas de zona horaria siempre son complicados, pero creo que el problema es que su origen se está calculando en la zona horaria incorrecta (ya que la cadena solo especifica la fecha).

Intente usar origin <- now - as.numeric(now) .

Alternativamente, use lubridate::origin , que es la cadena "1970-01-01 UTC" .

Una solución completa, de nuevo utilizando lubridate .

start <- now() seq(start, start + days(3), by = "15 min")


Hay un método seq() para objetos de la clase "POSIXt" que es la super clase de las "POSIXlt" y "POSIXct" . Como tal no necesitas hacer ninguna conversión.

> now <- Sys.time() > tseq <- seq(from = now, length.out = 100, by = "mins") > length(tseq) [1] 100 > head(tseq) [1] "2012-01-19 10:52:38 GMT" "2012-01-19 10:53:38 GMT" [3] "2012-01-19 10:54:38 GMT" "2012-01-19 10:55:38 GMT" [5] "2012-01-19 10:56:38 GMT" "2012-01-19 10:57:38 GMT"


No tengo una respuesta a su problema, pero sí tengo una forma alternativa de crear vectores de objetos POSIXct . Si, por ejemplo, desea crear un vector de 1000 marcas de tiempo a partir de ahora con un delta_t de 15 minutos:

now = Sys.time() dt = 15 * 60 # in seconds timestamps = now + seq(0, 1000) * dt > head(timestamps) [1] "2012-01-19 11:17:46 CET" "2012-01-19 11:32:46 CET" [3] "2012-01-19 11:47:46 CET" "2012-01-19 12:02:46 CET" [5] "2012-01-19 12:17:46 CET" "2012-01-19 12:32:46 CET"

El truco es que puede agregar un vector de segundos a un objeto POSIXct .


Una alternativa al uso de seq.POSIXt es xts::timeBasedSeq , que le permite especificar la secuencia como una cadena:

library(xts) now <- Sys.time() timeBasedSeq(paste("2012-01-01/",format(now),"/H",sep="")) # Hourly steps timeBasedSeq(paste("2012-01-01/",format(now),"/d",sep="")) # Daily steps