2009-11-26 7 views
6

Je lis une table et contient des chaînes décrivant les horodatages. Je veux juste convertir la chaîne à un type datetime intégré ...Comprendre les dates/heures (POSIXc et POSIXct) dans 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 je tente de stocker la colonne datetime dans le data.frame, je reçois une curieuse erreur:

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

mais si je passe par une représentation numérique tenue à l'data.frame, cela fonctionne ...

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 

toute aide à comprendre la situation?

Répondre

12

strptime retours classe POSIXlt, vous avez besoin POSIXct dans le cadre de données:

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" 

classe POSIXct représente le (signé) le nombre de secondes depuis le début de 1970 comme vecteur numérique. Classe POSIXlt est une liste nommée de vecteurs représentant sec, min, heure, date, mon, année, 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

Une autre chose intéressante à noter est que la longueur() d'un objet POSIXlt est toujours 9. Les longueurs des composants individuels, tels que $ min, augmente pour refléter le nombre d'horodatages à l'intérieur de l'objet. – Sharpie

+0

une autre chose intéressante: j'ai utilisé le test pour examiner ce qui arrive à un'POSIXlt 'quand j'y ajoute un numéro et en fait le résultat est un'POSIXct'. ceci explique ce que j'observais en premier lieu. – mariotomo

Questions connexes