Domanda

Ho il vettore di carattere seguente

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

voglio convertire questo in volta gli oggetti in modo da faccio questo:

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

Perché A e B hanno lunghezze diverse?

> length(a)
[1] 8
> length(b)
[1] 9
È stato utile?

Soluzione

Il b oggetto ha classe POSIXlt. Array di datteri POSIXlt restituiscono sempre una lunghezza di 9, dal momento che la rappresentano una lista denominata di nove vettori:

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 Classe, che rappresenta il (firmato) numero di secondi dall'inizio del 1970 come un vettore numerico, ti dà la durata prevista:

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

Altri suggerimenti

Come si può vedere nel ?strptime converte stringhe di caratteri in classe POSIXlt. In R ci sono due tipi di volte: POSIXlt e POSIXct. Descrizione è in ?DateTimeClasses, ma alla scorciatoia:

  

Class "POSIXct" rappresenta il (firmato) numero di secondi dal momento che la   inizio 1970 come numerico   vettoriale.

     

Class "POSIXlt" è un nome   elenco dei vettori che rappresenta   sec 0-61: secondi   min 0-59: minuti ore 0-23: ore 1-31 mday: giorno del mese   mon 0-11: mesi dopo la prima di   l'anno. anni anno dal 1900.   wday 0-6 giorni della settimana, a partire   di domenica. yday 0-365: giorno della   anno. isdst ora legale   bandiera. Positivo se in vigore, zero se   Non, negativo se sconosciuta.

Così il vostro b è la lista dei 9 vettori, 8 di lunghezza ciascuno.

Si può vedere:

sapply(b,length)

Si potrebbe utilizzare la conversione precisa:

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

Per la cronaca, questa FAQ problema è destinato a cambiare in R 2.11.0:

  

2.11.0 NUOVE CARATTERISTICHE

     

lunghezza (POSIXlt) ora restituisce la lunghezza   del corrispondente astratto   TimeDate-vector anziché sempre 9   (La lunghezza della lista sottostante   struttura). (Voglia di PR # 14073 e   PR # 10507).

Ecco dall'entrata 2 dicembre del feed RSS che riassume le variazioni giornaliere in archivio Subversion, il href="http://developer.r-project.org" rel="nofollow pagina sviluppatore per maggiori dettagli circa il feed.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top