将毫秒时间戳解析为R中的时间

时间:2013-08-23 00:22:22

标签: r datetime time-series

我之前已经问过这个,但我找不到确切的答案。 如果我有一个代表自午夜以来毫秒的数字,比如说34200577,我怎么把它变成R时间呢?

3 个答案:

答案 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