2011-10-05 19 views
11

Así que tienen un conjunto de marcas de tiempo de la siguiente manera:¿Cómo grafico solo la porción de tiempo de una marca de tiempo incluyendo una fecha?

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

Quiero hacer un histograma de sólo los tiempos. Lo que hice fue dividir la columna en el espacio para obtener sólo las veces, y luego convertir de nuevo a un objeto POSIXct con el fin de qplot para trazar que:

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

Sin embargo, la salida de as.POSIXct(strptime((str_split_fixed(as.character(datetime), " ", 2)[,2]), "%H:%M:%S")) es

"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 trama lo que quiero, pero esto parece un truco complicado para mí. Sin duda, hay una mejor manera de hacer esto? Podría convertirme en una época y trazar eso, pero estaba tratando de evitar tener que hacer eso como un paso adicional.

La pregunta más importante es, "¿Cómo controlo la salida de strptime?"

Respuesta

13

¿Qué hay de este enfoque?

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) 

El cálculo, dtPOSIXct - trunc(dtPOSIXct, "days"), extractos momento de objetos de clase POSIXct en horas.

plot(p)

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

Para 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

Gracias, no he usado tanto trunc. ¡Siempre hay algo nuevo que aprender! –

+1

Estoy confundido por algo. Estoy trabajando en una situación similar, aunque con algo más de 2 millones de observaciones. Cuando uso ** format = "% S: 00" **, obtengo 00:00 para todas las etiquetas del eje X.Intenté cambiar a **% H ** (S = segundos y H = horas para esta función), y eso tampoco es correcto: el eje X comienza a las 17:00, cuenta hasta 0:00 y luego vuelve a 18: 00 al final. (Las etiquetas están espaciadas uniformemente durante ese lapso de 25 horas). –

+0

Hmm, me pregunto si esto tiene algo que ver con que estoy en CDT, que está 5 horas por debajo de GMT, y el tiempo POSIX comienza a contar desde la medianoche GMT, 1 de enero , 1970? Entonces, si agrego 5 * 60 * 60 a cada valor ... No, rayar eso. Estoy en CST en este momento, que es GMT-6. –

4

Sólo tiene que utilizar las herramientas básicas ya que estaban destinados:

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) 

El formato de las cuerdas es el valor predeterminado para analizar con as.POSIXct, ver ?strptime para obtener más información o si tiene algo más que este formato.

Si desea un formato de cadena específica de sus valores de fecha y hora, utilice format, como en

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

Una vez más, consulte ?strptime para más detalles. Si realmente desea eliminar los valores de tiempo, puede usar la clase Date. Solo tenga en cuenta que las fechas y horas necesitan su estructura completa, cualquier otra representación es solo texto formateado.

qplot (as.Date (fecha y hora))

+0

Gracias por la respuesta, pero que traza las marcas de tiempo, no sólo la porción de tiempo. De hecho, estoy tratando de eliminar las fechas y solo graficar los tiempos, por lo que el eje x abarcaría solo 24 horas. –

+0

¿A qué argumento de palabra clave corresponde su ''% d-% b "' en la llamada 'format'? No puedo encontrar nada que sea apropiado en formato "?". – TMOTTM

+0

See? Strptime tiene un alias para formatear. POSIXct – mdsumner

Cuestiones relacionadas