web-dev-qa-db-fra.com

Extraction du temps de POSIXct

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?

72
nico

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

enter image description here


Pour plus d’aide, voir ?DateTimeClasses

97
Andrie

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:

enter image description here

14
Dirk Eddelbuettel

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"
8
JegarP

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)

4
Denis Chabot

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.

4
Spacedman

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)

enter image description here

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)
3
Matthew Lundberg