【发布时间】:2013-08-25 21:55:34
【问题描述】:
我以前有人问过这个问题,但我找不到确切的答案。 如果我有一个代表自午夜以来毫秒数的数字,例如 34200577,我如何将其转换为 R 时间?
【问题讨论】:
标签: r datetime time-series
我以前有人问过这个问题,但我找不到确切的答案。 如果我有一个代表自午夜以来毫秒数的数字,例如 34200577,我如何将其转换为 R 时间?
【问题讨论】:
标签: r datetime time-series
在午夜构造一个“基线时间”,添加给定的毫秒一次转换为秒并解释为时间:
R> as.POSIXct(as.numeric(ISOdatetime(2013,8,22,0,0,0)) + 34200577/1e3,
+ origin="1970-01-01")
[1] "2013-08-22 09:30:00.576 CDT"
R>
其实更短
R> ISOdatetime(2013,8,22,0,0,0) + 34200577/1e3
[1] "2013-08-22 09:30:00.576 CDT"
R>
与ISOdatetime() 一样工作,返回一个适当的时间对象它以小数秒为单位,所以我们只需应用给定的偏移量。
这似乎是正确的
R> 34200577/1e3 # seconds
[1] 34200.6
R> 34200577/1e3/60 # minutes
[1] 570.01
R> 34200577/1e3/60/60 # hours
[1] 9.50016
R>
【讨论】:
POSIXct 使用 1970 作为其时间刻度的原点(以秒为单位。)
> time= as.POSIXct(34200577/1000 , origin=Sys.Date() )
> time
[1] "2013-08-22 02:30:00 PDT"
请注意 Dirk 的方法和我的方法之间的结果差异。输入的 POSIX 时间假设发生在 UCT 中,因此我在 UCT-8 中的位置出现了额外的 8 小时。
> difftime( as.POSIXct(34200577/1000 , origin=Sys.Date() ) , Sys.Date() )
Time difference of 9.50016 hours
您可以通过以下方式获取自午夜以来的时间:
format( as.POSIXct(34200577/1000 , origin=Sys.Date(), tz="UCT" ),
format="%H:%M:%S")
[1] "09:30:00"
【讨论】:
TZ 转换。
我认为值得指出的一点“问题”......
在 Windows 64 位的 R 3.1.2 中,我得到了 Dirk 示例的以下结果
> ISOdatetime(2013,8,22,0,0,0) + 34200577/1e3
[1] "2013-08-22 09:30:00 BST"
请注意缺少小数秒。这是由于“digits.secs”的选项设置
> getOption("digits.secs")
NULL
如下设置此选项会产生预期的结果:
> options(digits.secs=3)
> ISOdatetime(2013,8,22,0,0,0) + 34200577/1e3
[1] "2013-08-22 09:30:00.576 BST"
正如您可能猜到的,这与输出的格式有关,而不是我们从日期算术中得到的实际值。有关这方面的文档,请参阅 ?strptime 和 ?options。
【讨论】: