【问题标题】:Converting unix seconds in milliseconds to POSIXct/POSIXlt以毫秒为单位将 unix 秒转换为 POSIXct/POSIXlt
【发布时间】:2011-01-28 06:22:46
【问题描述】:

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

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

另外,有没有办法在不指定原点的情况下进行这种转换?

谢谢

【问题讨论】:

    标签: datetime r


    【解决方案1】:

    帮助页面实际上暗示了一个区别:

    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 发生了隐式 TZ 转换。考虑到

    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 似乎是唯一一个拥有所有细节的人。

    最后,你不能没有起源。但是您可以定义使用 epoch 作为原点的包装器(如此处)或使用 2000-01-01 或......只要保持一致即可。

    【讨论】:

    • Dirk - 感谢您的解释。那你建议我在这里做什么?我有一个带有 unix 时间戳的完整时间序列数据集。我希望用 xts 来代表它们。
    • 好吧,我也一直这样做(当连接来自内部数据仓库的数据时),我只是接受as.POSIXct(vecOfTimestamps) 将获得本地时间值。查看我们在此处找到的内容,首先通过as.POSIXlt 作为额外步骤可能会有所帮助。我仍然编写了适当的 C++ 表示作为 Rcpp 的 TODO 项。
    • 谢谢你,现在我会接受你的建议,让我更进一步。当我有机会时,可以更深入地研究一些东西。是否有一个 R 错误跟踪器,我可以在其中发布此内容?
    • 从 r-devel 档案开始(可能通过 rseek.org 和列表选项卡)。可能有一个我忘记的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多