Pregunta

tengo el vector de caracteres a continuación

a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43",  "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16",  "2009-08-01 08:04:13", "2009-08-01 16:16:13")

quiero convertir esto en tiempo objetos así hago esto:

b = strptime(a, "%Y-%m-%d %H:%M:%S")

¿Por qué A y B tienen diferentes longitudes?

> length(a)
[1] 8
> length(b)
[1] 9
¿Fue útil?

Solución

El objeto tiene b POSIXlt clase. Las matrices de fechas POSIXlt siempre devuelven una longitud de 9, ya que la representan una lista con nombre de nueve vectores:

R> class(b)
[1] "POSIXt"  "POSIXlt"

R> unclass(b)
$sec
[1] 33 38 43 49 49 16 13 13
$min
[1]  0  0  0  0 58 53  4 16
$hour
[1] 18 18 18 18  1  1  8 16
$mday
[1] 31 31 31 31  1  1  1  1
$mon
[1] 6 6 6 6 7 7 7 7
$year
[1] 109 109 109 109 109 109 109 109
$wday
[1] 5 5 5 5 6 6 6 6
$yday
[1] 211 211 211 211 212 212 212 212
$isdst
[1] 1 1 1 1 1 1 1 1

POSIXct Class, que representa el número (firmado) de segundos desde el comienzo de 1970 como un vector numérico, le da la longitud esperada:

R> length(as.POSIXct(a))
[1] 8
R> unclass(as.POSIXct(a))
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09
[8] 1.249e+09
attr(,"tzone")
[1] ""

Otros consejos

Como se puede ver en ?strptime que convierte las cadenas de caracteres para POSIXlt clase. En R hay dos tipos de veces: POSIXlt y POSIXct. La descripción es en ?DateTimeClasses, sino para acceso directo:

  

Clase "POSIXct" representa el (firmado) número de segundos desde el   principios de 1970 como un numérico   vector.

     

Clase "POSIXlt" es un nombre   lista de vectores que representan   sec 0-61: segundo   0-59 min: minutos 0-23 horas: 1-31 horas mday: día del mes   lun 0-11: meses después de la primera   el año. año años desde 1900.   wday 0-6 días de la semana, a partir   el domingo. yday 0-365: día de la   año. isdst El horario de verano   bandera. Positivo si en vigor, cero si   No, si no se conoce negativo.

Así que su b lista de 9 vectores, 8 de longitud cada uno es.

Se puede ver:

sapply(b,length)

Se puede utilizar la conversión exacta:

b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="")
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="")

length(b_1) # 9
length(b_2) # 8

Sólo para que conste, este problema FAQ está a punto de cambiar en I 2.11.0:

  

2.11.0 NOVEDADES

     

longitud (POSIXlt) ahora devuelve la longitud   del resumen correspondiente   timedate-vector en lugar de siempre 9   (La longitud de la lista subyacente   estructura). (Deseo de PR # 14073 y   PR # 10507).

Eso es de la entrada 2 de diciembre del resumen de los cambios diarios en el archivo en Subversion RSS, el href="http://developer.r-project.org" rel="nofollow noreferrer"> página para detalles acerca de la alimentación.

scroll top