2010-03-16 144 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

相关问题