如何在R中加载微秒精度的时间序列?

如何在R中加载微秒精度的时间序列?,r,time-series,R,Time Series,我需要从历元以来的微秒值加载POSIXlt变量。有没有更好的方法来做到这一点: options(digits.secs=6) mytime=1366039619645990 as.POSIXlt(mytime %/% 1e6, tz="EST", origin="1970-01-01") + (mytime %% 1e6)/1e6 [1] "2013-04-15 10:26:59.64598 EST" 考虑到我有数百万条记录要加载,这似乎有点复杂。模除法可能会产生一些舍入错误(我在系统中发现)

我需要从历元以来的微秒值加载POSIXlt变量。有没有更好的方法来做到这一点:

options(digits.secs=6)
mytime=1366039619645990
as.POSIXlt(mytime %/% 1e6, tz="EST", origin="1970-01-01") + (mytime %% 1e6)/1e6
[1] "2013-04-15 10:26:59.64598 EST"

考虑到我有数百万条记录要加载,这似乎有点复杂。

模除法可能会产生一些舍入错误(我在系统中发现)。加上一小部分时间,即时间的最大准确度的一半,应该可以解决这个问题,尽管本质上它与您已经在做的事情没有什么不同:

as.POSIXlt( mytime/1e6 , tz="EST", origin="1970-01-01") + 5e-7
[1] "2013-04-15 10:26:59.64599 EST"
与之相比:

mytime=1366039619646000

# Produces rounding error
as.POSIXlt(mytime/1000000, tz="EST", origin="1970-01-01") + (mytime %% mytime)/1000000
[1] "2013-04-15 10:26:59.645 EST"

as.POSIXlt( mytime/1e6 , tz="EST", origin="1970-01-01") + 5e-7
[1] "2013-04-15 10:26:59.646 EST"
什么时候

mytime=1366039619645991
as.POSIXlt(mytime/1000000, tz="EST", origin="1970-01-01") + 5e-7
[1] "2013-04-15 10:26:59.645991 EST"

这将消除模和除法:

> mytime=1366039619645991
> mytime.secs = mytime %/% 1e+6
> mytime.usecs = mytime - as.integer(mytime.secs)*1e6
> as.POSIXlt(mytime.secs, tz="", origin="1970-01-01") + mytime.usecs*1e-6+0.0000005
[1] "2013-04-15 11:26:59.645991 EDT"

这似乎会产生一些舍入错误-例如对于
mytime=1366039619646000
?@SimonO101可能是这样,我认为基础值实现为双精度,因此它可以在您的计算机上提供不同的舍入。添加此零(
(mytime%%mytime)/1000000
)到底有什么意义@埃迪,我就是这么想的。但请在不添加0的情况下进行尝试。没有它我可以得到.64598。奇怪。@RobertKubrick很抱歉在这么长时间后把这个翻了回来(我最近一直在研究时间问题)。您正在两次添加亚秒值(因为
/
不是整数除法)。“正确”的亚秒值应为.645990。这给了它(模取整误差):
as.POSIXlt(mytime%/%1e6,tz=“EST”,origin=“1970-01-01”)+(mytime%%1e6)/1e6
这并不能解决我的取整误差,它只是将它们转移过来。使用
mytime=1366039619645991
我得到了
>as.POSIXlt(mytime/1000000,tz=“EST”,origin=“1970-01-01”)+1e-6[1]“2013-04-15 10:26:59.645992 EST”>as.POSIXlt(mytime/1000000,tz=“EST”,origin=“1970-01-01”)[1]“2013-04-15 10:26:59.645991 EST”
@eddi添加的分数太大了。它与时间的最小可能增量相同。增加一半的增量应该可以解决这个问题。我已经更新了。这是否也为您提供了正确的结果?:)经过几次尝试@编写正确的表达式,它似乎起到了作用,但我不清楚为什么会这样works@MatthewLundberg谢谢,所有示例都有舍入问题。现在修好了。