2010-03-16 180 views
18

爲什麼我在R中將unix時間戳轉換爲datetime對象時看到差異?將以毫秒爲單位的unix秒數轉換爲POSIXct/POSIXlt

> as.POSIXlt(1268736919, origin="1970-01-01", tz="America/New_York") 
[1] "2010-03-16 06:55:19 EDT" 

> as.POSIXct(1268736919, origin="1970-01-01", tz="America/New_York") 
[1] "2010-03-16 11:55:19 EDT" 

POSIXlt的結果實際上是正確的。

此外,有沒有辦法做這種轉換,而不指定原點?

感謝

回答

20

幫助頁面實際上暗示了一個差異:

Value: 

    ‘as.POSIXct’ and ‘as.POSIXlt’ return an object of the appropriate 
    class. If ‘tz’ was specified, ‘as.POSIXlt’ will give an 
    appropriate ‘"tzone"’ attribute. 

這東西是挑剔的 - 我覺得這是一個隱含的TZ轉換爲發生as.POSIXct。考慮一下

R> print(as.numeric(as.POSIXct(as.POSIXlt(1268736919, 
           origin="1970-01-01"))), digits=10) 
[1] 1268736919 
R> print(as.numeric(as.POSIXct(1268736919, origin="1970-01-01")), digits=10) 
[1] 1268758519 

第二個(使用as.POSIXct)不返回原始輸入。不幸的是,Brian D. Ripley似乎是這裏唯一擁有所有細節的人。

最後,你不能沒有起源。但是你可以定義使用紀元作爲原點的包裝器(如這裏)或者使用2000-01-01或者......保持一致。

+0

Dirk - 謝謝你的解釋。那麼你建議我在這裏做什麼?我有一個完整的時間序列數據集與unix時間戳。我希望用xt來表示它們。 – signalseeker 2010-03-16 19:10:12

+0

我也一直這樣做(當連接來自內部數據倉庫的數據時),我只是接受'as.POSIXct(vecOfTimestamps)'會得到本地時間值。看看我們在這裏找到的,首先通過'as.POSIXlt'作爲額外的步驟可能會有所幫助。作爲Rcpp的TODO項目,我仍然有正確的C++表示形式。 – 2010-03-16 19:50:29

+0

謝謝你現在我會採取你的建議去做額外的一步。當我有機會的時候有更深入的看法。有沒有一個R錯誤跟蹤器,我可以發佈這個? – signalseeker 2010-03-16 21:18:13

相關問題