2009-11-26 71 views
6

我正在閱讀一個表,它包含描述時間戳的字符串。我只是想從字符串轉換爲內置的日期時間型...瞭解R中的日期/時間(POSIXc和POSIXct)

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

,如果我嘗試了datetime列存儲到data.frame,我得到一個奇怪的錯誤:

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

但如果我通過在data.frame舉行的數字表示,它的工作原理...

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 

在瞭解情況的任何幫助?

回答

12

strptime返回類POSIXlt,需要POSIXct在數據幀:

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" 

POSIXct類表示自的 1970開始爲數值矢量(簽名)的秒數。 POSIXlt類是表示秒,分,小時,MDAY,星期一,年矢量的命名列表等

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

需要注意的另一有趣的是,一個POSIXlt對象的長度()是始終9.長度的單個組件(如$ min)增加以反映對象內部的時間戳記的數量。 – Sharpie 2009-11-26 17:20:01

+0

還有一件有趣的事情:我使用了wouldput'來檢查'POSIXlt'發生了什麼,當我給它添加一個數字時,實際上結果是'POSIXct'。這解釋了我第一次觀察到的情況。 – mariotomo 2010-10-18 18:29:45