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 existentessi 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)