second hora formato factor r date time posixct

hora - Tiempo de extracción de POSIXct



r time (5)

¿Cómo puedo extraer el tiempo de una serie de objetos POSIXct que descartan la parte de la fecha?

Por ejemplo, tengo:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", "POSIXt"))

que corresponde a estas fechas:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" "2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" "2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET" "2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET" "2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

Ahora, tengo algunos valores para un parámetro medido en esos momentos

val <- c(1.25343125e-05, 0.00022890575, 3.9269125e-05, 0.0002285681875, 4.26353125e-05, 5.982625e-05, 2.09575e-05, 0.0001516951251, 2.653125e-05, 0.0001021391875)

Me gustaría trazar val versus tiempo del día, independientemente del día específico en que se midió val.

¿Hay alguna función específica que me permita hacer eso?


El valor time_t para la medianoche GMT siempre es divisible por 86400 ( 24 * 3600 ). El valor para segundos a partir de la medianoche GMT es por tanto el time %% 86400 .

La hora en GMT es (time %% 86400) / 3600 y puede usarse como el eje x de la gráfica:

plot((as.numeric(times) %% 86400)/3600, val)

Para ajustar para una zona horaria, ajuste el tiempo antes de tomar el módulo, agregando el número de segundos que su zona horaria está por delante de GMT. Por ejemplo, el horario de verano (CDT) central de Estados Unidos es de 5 horas detrás de GMT. Para trazar el tiempo en CDT, se usa la siguiente expresión:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)


Ha habido respuestas previas que demostraron el truco. En esencia:

  • debe conservar los tipos POSIXct para aprovechar todas las funciones de trazado existentes

  • si quiere ''superponer'' varios días en una sola parcela, resaltando la variación intra diaria, el mejor truco es también ...

  • imponer el mismo día (y mes e incluso año si es necesario, que no es el caso aquí)

lo cual puede hacer anulando los componentes de día y mes cuando está en representación POSIXlt , o simplemente compensando el ''delta'' relativo a 0:00:00 entre los diferentes días.

Por lo tanto, con los times y el val proporcionados por usted:

## impose month and day based on first obs ntimes <- as.POSIXlt(times) # convert to ''POSIX list type'' ntimes$mday <- ntimes[1]$mday # and $mon if it differs too ntimes <- as.POSIXct(ntimes) # convert back par(mfrow=c(2,1)) plot(times,val) # old times plot(ntimes,val) # new times

produce esto contrastando las escalas de tiempo originales y modificadas:


No puedo encontrar nada que trate exactamente los tiempos del reloj, así que solo usaría algunas funciones del paquete: lubridate y trabajar con segundos a partir de la medianoche:

require(lubridate) clockS = function(t){hour(t)*3600+minute(t)*60+second(t)} plot(clockS(times),val)

Es posible que desee ver algunos de los códigos de eje para descubrir cómo etiquetar los ejes correctamente.


Puede usar strftime para convertir las strftime en cualquier formato de caracteres:

> t <- strftime(times, format="%H:%M:%S") > t [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41" [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

Pero eso no ayuda mucho, ya que quiere trazar sus datos. Una solución consiste en quitar el elemento de fecha de sus tiempos y luego agregar una fecha idéntica a todas sus horas:

> xx <- as.POSIXct(t, format="%H:%M:%S") > xx [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT" [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT" [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT" [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT" [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

Ahora puede usar estos objetos de datetime en su diagrama:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

Para obtener más ayuda, vea ?DateTimeClasses


Se han proporcionado muchas soluciones, pero no he visto esta, que usa el paquete cron:

hours = times(strftime(times, format="%T")) plot(val~hours)

(Lo siento, no tengo derecho a publicar una imagen, tendrás que trazarla tú mismo)