2

自纪元以来,我需要从微秒值加载 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"

考虑到我要加载数百万条记录,这似乎有点令人费解。

4

2 回答 2

2

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

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"
于 2013-04-23T22:43:07.397 回答
0

这将摆脱模数和除法:

> 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"
于 2013-04-24T12:01:08.627 回答