Questa è una buona domanda ed evidenzia alcune delle difficoltà nell'affrontare le date in R. Il pacchetto lubridate è molto utile, quindi di seguito presenterò due approcci, uno basato sulla base (come suggerito da @ RJ-) e il altro usando il lubridato.
ricreare le (prime due righe) della dataframe nel post originale:
foo <- data.frame(start.time = c("2012-02-06 15:47:00",
"2012-02-06 15:02:00",
"2012-02-22 10:08:00"),
duration = c(1,2,3))
Convertire a POSIXct e la classe POSIXt (due modi per fare questo)
# using base::strptime
t.str <- strptime(foo$start.time, "%Y-%m-%d %H:%M:%S")
# using lubridate::ymd_hms
library(lubridate)
t.lub <- ymd_hms(foo$start.time)
Ora, tempo di estratto come ore decimali
# using base::format
h.str <- as.numeric(format(t.str, "%H")) +
as.numeric(format(t.str, "%M"))/60
# using lubridate::hour and lubridate::minute
h.lub <- hour(t.lub) + minute(t.lub)/60
dimostrano che questi approcci sono uguali:
identical(h.str, h.lub)
Quindi scegliere uno dei metodi di cui sopra per assegnare un'ora decimale foo$hr
:
foo$hr <- h.str
# If you prefer, the choice can be made at random:
foo$hr <- if(runif(1) > 0.5){ h.str } else { h.lub }
poi grafico usando il pacchetto ggplot2:
library(ggplot2)
qplot(foo$hr, foo$duration) +
scale_x_datetime(labels = "%S:00")
fonte
2012-05-22 18:42:19
le librerie 'lubridate' e' zoo' potrebbero essere utili per voi. ma in base R, 'format (foo $ start.time, format = '% H: M')'. – Justin
Grazie. Un problema con 'format (foo $ start.time, format = '% H: M')' è che l'output è in formato carattere. Mi piacerebbe che l'output fosse in una sorta di formato numerico in modo che potesse essere usato come asse x di un grafico. – andrewj
Ci sono molti modi. Ancora una volta ti indico a "lubridate" o [questo post] (http://stackoverflow.com/questions/7655514/how-do-i-plot-only-the-time-portion-of-a-timestamp- incluso-a-date) – Justin