2009-11-26 11 views
6

Estoy leyendo una tabla y contiene cadenas que describen las marcas de tiempo. Sólo quiero convertir de cadena a un tipo de fecha y hora incorporada ...comprensión de fechas/horas (POSIXc y POSIXct) en R

R> Q <- read.table(textConnection(' 
       tsstring 
1 "2009-09-30 10:00:00" 
2 "2009-09-30 10:15:00" 
3 "2009-09-30 10:35:00" 
4 "2009-09-30 10:45:00" 
5 "2009-09-30 11:00:00" 
'), as.is=TRUE, header=TRUE) 
R> ts <- strptime(Q$tsstring, "%Y-%m-%d %H:%M:%S", tz="UTC") 

si intento para almacenar la columna datetime en el hoja.de.datos, aparece un curioso error:

R> Q$ts <- ts 
Error in `$<-.data.frame`(`*tmp*`, "ts", value = list(sec = c(0, 0, 0, : 
    replacement has 9 rows, data has 5 

pero si voy a través de una representación numérica que tuvo lugar en el hoja.de.datos, funciona ...

R> EPOCH <- strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC") 
R> Q$minutes <- as.numeric(difftime(ts, EPOCH, tz="UTC"), units="mins") 
R> Q$ts <- EPOCH + 60*Q$minutes 

cualquier ayuda en la comprensión de la situación?

Respuesta

12

strptime rendimientos clase POSIXlt, que necesitan POSIXct en la trama de datos:

R> class(strptime("2009-09-30 10:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC")) 
[1] "POSIXt" "POSIXlt" 
R> class(as.POSIXct("2009-09-30 10:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC")) 
[1] "POSIXt" "POSIXct" 

Clase POSIXct representa el (firmado) número de segundos desde el comienzo de 1970 como un vector numérico. Clase POSIXlt es una lista con nombre de vectores que representan seg, min, hora, mday, lunes, año, etc.

R> unclass(strptime("2009-09-30 10:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC")) 
$sec 
[1] 0 
$min 
[1] 0 
$hour 
[1] 10 
$mday 
[1] 30 
$mon 
[1] 8 
$year 
[1] 109 
$wday 
[1] 3 
$yday 
[1] 272 
$isdst 
[1] 0 
attr(,"tzone") 
[1] "UTC" 

R> unclass(as.POSIXct("2009-09-30 10:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC")) 
[1] 1.254e+09 
attr(,"tzone") 
[1] "UTC" 
+0

Otra cosa interesante a destacar es que la longitud() de un objeto POSIXlt es siempre 9. Las longitudes de los componentes individuales, como $ min, aumenta para reflejar el número de marcas de tiempo dentro del objeto. – Sharpie

+0

una cosa más interesante: utilicé el método de 'examinar' qué sucede con una 'POSIXlt' cuando le agrego un número y, de hecho, el resultado es un 'POSIXct'. esto explica lo que estaba observando en primera instancia. – mariotomo

Cuestiones relacionadas