4

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?

4

3 回答 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 回答