将以毫秒为单位的unix秒数转换为POSIXct/POSIXlt
问题描述:
为什么我在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的结果实际上是正确的。
此外,有没有办法做这种转换,而不指定原点?
感谢
答
帮助页面实际上暗示了一个差异:
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或者......保持一致。
Dirk - 谢谢你的解释。那么你建议我在这里做什么?我有一个完整的时间序列数据集与unix时间戳。我希望用xt来表示它们。 – signalseeker 2010-03-16 19:10:12
我也一直这样做(当连接来自内部数据仓库的数据时),我只是接受'as.POSIXct(vecOfTimestamps)'会得到本地时间值。看看我们在这里找到的,首先通过'as.POSIXlt'作为额外的步骤可能会有所帮助。作为Rcpp的TODO项目,我仍然有正确的C++表示形式。 – 2010-03-16 19:50:29
谢谢你现在我会采取你的建议去做额外的一步。当我有机会的时候有更深入的看法。有没有一个R错误跟踪器,我可以发布这个? – signalseeker 2010-03-16 21:18:13