I'm this has been asked before, but I just can't find the exact answer. If I have a number which represents milliseconds since midnight, say 34200577, how do I turn this into an R time?
问问题
4523 次
3 回答
6
在午夜构造一个“基线时间”,将给定的毫秒添加一次转换为秒并解释为时间:
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>
于 2013-08-23T00:55:06.730 回答
2
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"
于 2013-08-23T00:38:20.370 回答
2
我认为值得指出的一点“问题”......
在 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
获取有关此内容的文档。
于 2015-03-11T12:16:52.033 回答