我之前已经问过这个,但我找不到确切的答案。 如果我有一个代表自午夜以来毫秒的数字,比如说34200577,我怎么把它变成R时间呢?
答案 0 :(得分: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>
答案 1 :(得分: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"
答案 2 :(得分:2)
我认为值得指出的一点“gottcha”......
在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
。