And*_*ern 7 time r rounding-error rounding milliseconds
考虑到以下问题,在R.下舍入毫秒数.如何绕过它以便时间正确?
> options(digits.secs=3)
> as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.060 UTC"
> as.POSIXlt("13:29:56.062", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.063", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"
Run Code Online (Sandbox Code Playgroud)
我注意到这个URL提供了背景信息,但没有解决我的问题: 在R中调用strptime时毫秒难题.
此URL也触及该问题但未解决此问题:R xts:索引中的.001毫秒.
在这些情况下,我确实看到以下内容:
> x <- as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> print(as.numeric(x), digits=20)
[1] 1339075796.0610001087
Run Code Online (Sandbox Code Playgroud)
URL似乎也表明这只是一个显示问题,但我注意到使用"%OS3"没有选项行的语句似乎没有拾取正确的位数.
我在Windows下使用的版本是32位2.15.0,但这似乎存在于R的其他情况下.
请注意,我的原始数据是CSV文件中的这些日期时间字符串我必须找到一种方法,将它们从字符串转换为正确的毫秒时间.
我没有看到:
> options(digits.secs = 4)
> as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.062", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.062 UTC"
> as.POSIXlt("13:29:56.063", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"
> options(digits.secs = 3)
> as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.062", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.062 UTC"
> as.POSIXlt("13:29:56.063", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"
Run Code Online (Sandbox Code Playgroud)
同
> sessionInfo()
R version 2.15.0 Patched (2012-04-14 r59019)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_GB.utf8 LC_NUMERIC=C
[3] LC_TIME=en_GB.utf8 LC_COLLATE=en_GB.utf8
[5] LC_MONETARY=en_GB.utf8 LC_MESSAGES=en_GB.utf8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods
[7] base
Run Code Online (Sandbox Code Playgroud)
使用"%OSn"格式字符串,一个强制截断.如果小数秒不能在浮点中精确表示,则截断可能会错误地进行.如果你发现事情出错了,你也可以明确地将你想要的单位四舍五入,或者添加一半你想要操作的分数(在所示的情况下0.0005):
> t1 <- as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
> t1
[1] "2012-06-07 13:29:56.061 UTC"
> t1 + 0.0005
[1] "2012-06-07 13:29:56.061 UTC"
Run Code Online (Sandbox Code Playgroud)
(但我说,我在这里看不到问题.)
后一点是Simon Urbanek于2012年5月30日在R-Devel邮件列表上提出的.