2012-03-23 22 views
59

Come estrarre l'ora da una serie di oggetti POSIXct scartando la parte della data?Tempo di estrazione da POSIXct

Per esempio, io ho:

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

che corrisponde a queste date:

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

Ora, ho alcuni valori per un parametro misurato a quei tempi

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) 

Vorrei tracciare val vs tempo del giorno, indipendentemente dal giorno specifico in cui val è stato misurato.

Esiste una funzione specifica che mi consenta di farlo?

risposta

76

È possibile utilizzare strftime per convertire datetimes in qualsiasi formato carattere:

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

Ma questo non aiuta molto, dal momento che si desidera tracciare i dati. Una soluzione è mettere a nudo l'elemento risalgono i tempi, e quindi di aggiungere una data identica a tutti i tempi:

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

Ora è possibile utilizzare questi datetime oggetti nel vostro diagramma:

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

enter image description here


Per ulteriori informazioni, vedere ?DateTimeClasses

12

Ci sono state risposte precedenti che hanno mostrato il trucco. In sostanza:

  • è necessario mantenere POSIXct tipi di sfruttare tutte le funzioni di plotting esistenti

  • se si vuole 'overlay' diversi giorni vale la pena su un unico appezzamento, mettendo in evidenza la variazione intra-giornaliera , il miglior trucco è troppo ...

  • impone lo stesso giorno (e il mese e l'anno, anche se necessario, che non è il caso qui)

che è possibile eseguire sovrascrivendo i componenti del giorno del mese e del mese quando si trova nella rappresentazione POSIXlt o semplicemente sfalsando il "delta" relativo a 0:00:00 tra i diversi giorni.

Quindi, con times e val come utilmente prevista da voi:

## 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 

cede questa contrastanti le scale di tempo originali e modificati:

enter image description here

3

io non riesco a trovare nulla che si occupa di esattamente i tempi di clock, quindi utilizzerei solo alcune funzioni del pacchetto: lubridate e lavoro con secondi-da-mezzanotte:

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

Si potrebbe quindi voler esaminare alcuni dei codici degli assi per capire come etichettare gli assi in modo corretto.

+0

Bello, dovrò guardare "lubridate", sembra un pacchetto interessante. – nico

2

Il valore time_t la mezzanotte GMT è sempre divisibile per 86400 (24 * 3600). Il valore per GMT da secondi a mezzanotte è quindi time %% 86400.

l'ora in GMT è (time %% 86400)/3600 e questo può essere usato come l'asse x della trama:

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

enter image description here

per regolare un fuso orario, regolare il tempo prima di prendere il modulo , aggiungendo il numero di secondi in cui il fuso orario è in anticipo rispetto a GMT. Ad esempio, l'ora legale centrale degli Stati Uniti (CDT) è di 5 ore indietro rispetto a GMT. A tramare contro il tempo nel CDT, la seguente espressione viene utilizzata: sono stati forniti

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

Tante soluzioni, ma non ho visto questo, che utilizza il pacchetto Chron:

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

(mi dispiace, Non ho il diritto di pubblicare un'immagine, dovrai tracciarla tu stesso)