2011-10-05 9 views
11

quindi ho una serie di timestamp in questo modo:Come faccio a tracciare solo la porzione di tempo di un timestamp che include una data?

datetime<-c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00") 

Voglio fare un istogramma dei soli tempi. Quello che ho fatto è stato quello di dividere la colonna presso lo spazio per ottenere solo i tempi, poi convertire di nuovo ad un oggetto POSIXct in ordine per qplot per tracciare esso:

library(ggplot2, stringr)  
qplot(as.POSIXct(strptime((str_split_fixed(as.character(time), " ", 2)[,2]), "%H:%M:%S"))) 

Tuttavia, l'uscita del as.POSIXct(strptime((str_split_fixed(as.character(datetime), " ", 2)[,2]), "%H:%M:%S")) è

"2011-10-04 03:33:00 PDT" "2011-10-04 13:41:00 PDT" "2011-10-04 16:14:00 PDT" "2011-10-04 11:01:00 PDT" "2011-10-04 06:35:00 PDT" "2011-10-04 12:48:00 PDT" 

qplot traccia quello che voglio, ma questo mi sembra un incantesimo sconcio. Sicuramente c'è un modo migliore per farlo? Potrei convertire in epoche storiche e tracciare la trama, ma stavo cercando di evitare di doverlo fare come un passo in più.

La domanda più ampia è "Come controllo l'output di strptime?"

risposta

13

Che ne dite di questo approccio?

require("ggplot2") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 

p <- qplot(dtTime) + xlab("Time slot") + scale_x_datetime(format = "%S:00") 
print(p) 

Il calcolo, dtPOSIXct - trunc(dtPOSIXct, "days"), estrae il tempo di oggetti di classe POSIXct in ore.

plot(p)

Per ggplot2-0.9.1:

require("ggplot2") 
require("scales") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 

p <- qplot(dtTime) + xlab("Time slot") + 
    scale_x_datetime(labels = date_format("%S:00")) 
print(p) 

Per ggplot2-0.9.3.1:

require("ggplot2") 
require("scales") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 
class(dtTime) <- "POSIXct" 

p <- qplot(dtTime) + xlab("Time slot") + 
    scale_x_datetime(labels = date_format("%S:00")) 
print(p) 
+0

Grazie, non ho usato trunc così tanto. C'è sempre qualcosa di nuovo da imparare! –

+1

Sono confuso per qualcosa. Sto lavorando con una situazione simile anche se con poco più di 2 milioni di osservazioni. Quando uso ** format = "% S: 00" **, ottengo solo 00:00 per tutte le etichette dell'asse X.Ho provato a passare a **% H ** (S = secondi e H = ore per questa funzione), e non è giusto, neanche: l'asse X inizia alle 17:00, conta fino a 0:00 e poi torna a 18: 00 alla fine. (Le etichette sono equidistanti su tale intervallo di 25 ore.) –

+0

Hmm, mi chiedo se questo ha qualcosa a che fare con che io sono in CDT, che è 5 ore dietro GMT, e il tempo POSIX inizia a contare da mezzanotte GMT, 1 gennaio , 1970? Quindi se aggiungo 5 * 60 * 60 a ciascun valore ... No, grattalo. Sono in CST adesso, che è GMT-6. –

4

Basta usare gli strumenti di base come sono stati destinati:

dtstring <- c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00") 
datetime <- as.POSIXct(dtstring) 
library(ggplot2) 
qplot(datetime) 

Il formato delle corde è il valore predefinito per il parsing con as.POSIXct, vedere ?strptime per i dettagli o se hai qualcosa di diverso da questo formato.

Se si desidera un formato specifico stringa dal tuoi valori di data e ora, utilizzare format, come in

format(datetime, "%d-%b") 
[1] "28-Sep" "24-Aug" "19-Sep" "18-Aug" "17-Sep" "15-Aug" 

Anche in questo caso, vedere ?strptime per i dettagli. Se si desidera veramente eliminare i valori temporali, è possibile utilizzare la classe Date. Basta essere consapevoli del fatto che le date o le date richiedono la loro struttura completa, ogni altra rappresentazione è solo un testo formattato.

qplot (as.Date (datetime))

+0

Grazie per la risposta, ma che traccia i timestamp, non solo la parte relativa all'ora. In realtà sto cercando di eliminare le date e di tracciare i tempi, quindi l'asse x si estenderà su solo 24 ore. –

+0

A quale argomento di parole chiave corrisponde la variabile '"% d-% b "' nella chiamata 'format'? Non riesco a trovare nulla che sia appropriato in '? Format'. – TMOTTM

+0

Vedere? Strptime è alterato in formato.POSIXct – mdsumner