我需要从epoch开始,从微秒值加载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"
考虑到我要加载数百万条记录,这看起来有点复杂。
答案 0 :(得分: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"
答案 1 :(得分: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"