Comment extraire l'heure d'une série d'objets POSIXct supprimant la partie de date?
Par exemple, j'ai:
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"))
qui correspond à ces dates:
"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"
Maintenant, j'ai quelques valeurs pour un paramètre mesuré à ces moments
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)
Je voudrais tracer val contre l'heure du jour, indépendamment du jour spécifique où val a été mesurée.
Y at-il une fonction spécifique qui me permettrait de le faire?
Vous pouvez utiliser strftime
pour convertir les dates/heures en n'importe quel format de caractère:
> 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"
Mais cela n’aide pas beaucoup, puisque vous voulez tracer vos données. Une solution consiste à supprimer l'élément de date de vos heures, puis à ajouter une date identique à toutes vos heures:
> 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"
Vous pouvez maintenant utiliser ces objets datetime
dans votre tracé:
plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")
Pour plus d’aide, voir ?DateTimeClasses
Il y a eu des réponses précédentes qui ont montré le truc. En substance:
vous devez conserver POSIXct
types pour tirer parti de toutes les fonctions de traçage existantes
si vous souhaitez "superposer" plusieurs jours sur une seule parcelle, en soulignant la variation intra-quotidienne, le meilleur truc est aussi ...
imposer le même jour (et mois et même année si besoin, ce qui n'est pas le cas ici)
ce que vous pouvez faire en remplaçant les composants de jour et de mois lorsque vous êtes dans la représentation POSIXlt
ou tout simplement en décalant le 'delta' par rapport à 0:00:00 entre les différents jours.
Donc, avec times
et val
tels que vous nous les avez utilement fournis:
## 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
donne ceci en contrastant les échelles de temps originales et modifiées:
Le data.table
Le paquet a une fonction 'as.ITime
', qui peut le faire efficacement, utilisez ci-dessous:
library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"
De nombreuses solutions ont été fournies, mais je n'ai pas vu celle-ci, qui utilise le paquet chron:
hours = times(strftime(times, format="%T"))
plot(val~hours)
(désolé, je n'ai pas le droit de poster une image, vous devrez l'inventer vous-même)
Je ne trouve rien qui traite exactement des temps d'horloge, je n'utiliserais donc que certaines fonctions du package: lubrifier et travailler avec secondes-depuis-minuit:
require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)
Vous voudrez peut-être alors examiner une partie du code d'axe pour déterminer comment étiqueter correctement les axes.
Le time_t
La valeur pour minuit GMT est toujours divisible par 86400
(24 * 3600
). La valeur de secondes depuis minuit GMT est donc time %% 86400
.
L'heure GMT est le (time %% 86400) / 3600
et ceci peut être utilisé comme axe x du tracé:
plot((as.numeric(times) %% 86400)/3600, val)
Pour régler un fuseau horaire, ajustez l'heure avant de prendre le module, en ajoutant le nombre de secondes que votre fuseau horaire est en avance sur l'heure GMT. Par exemple, l'heure avancée des États-Unis est 5 heures en retard sur l'heure GMT. Pour tracer le temps en CDT, l'expression suivante est utilisée:
plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)