将Unix时间戳从毫秒转换为POSIXct/POSIXlt

18

为什么我在R中将Unix时间戳转换为日期时间对象时会看到差异?

> 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返回的结果实际上是正确的。

另外,有没有一种方法可以在不指定源的情况下进行这种转换?

谢谢

1个回答

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.

这些东西很微妙 - 我认为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时间戳的完整时间序列数据集。我希望使用xts来表示它们。 - signalseeker
我也经常这样做(在与内部数据仓库交互时),并且我只接受 as.POSIXct(vecOfTimestamps) 将获取本地时间值。根据我们在这里发现的内容,通过首先使用 as.POSIXlt 作为额外步骤可能会有所帮助。对于 Rcpp,我仍然需要编写适当的 C++ 表示形式。 - Dirk Eddelbuettel
谢谢,我现在会采纳你的建议并付出额外的努力。等有机会时,我会更深入地研究这个问题。是否有一个 R 缺陷跟踪器可以发布此问题? - signalseeker
从 r-devel 档案开始(可能通过 rseek.org 和列表选项卡)。也许有一个解决方案我已经忘记了。 - Dirk Eddelbuettel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接