options(digits.secs = 3);
> strptime("2007-03-30 15:00:00.007", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.007"
> strptime("2007-03-30 15:00:00.008", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.009", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.010", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.01"
> strptime("2007-03-30 15:00:00.011", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.010"
> strptime("2007-03-30 15:00:00.999", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.998"
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么与"009"有一毫秒的差异,然后再从"011"那里得到.
这与R-FAQ 7.31有关,虽然它采用了与平常不同的幌子.
您看到的行为来自以下组合:(a)二进制计算机的(大多数)十进制值的不精确表示; 和(b)的记录的行为strftime和strptime,这是截断而不是圆形秒的小数部分,以小数位指定数量.
从?strptime帮助文件(关键字'截断'):
特定于R是'%OSn',对于输出,将秒截断为'0 <= n <= 6'小数位(如果'%OS'后面没有数字,则使用'getOption(设置) "digits.secs")',或者如果未设置,'n = 3').
一个例子可能会比进一步的解释更有效地说明发生了什么:
strftime('2011-10-11 07:49:36.3', format="%Y-%m-%d %H:%M:%OS6")
[1] "2011-10-11 07:49:36.299999"
strptime('2012-01-16 12:00:00.3', format="%Y-%m-%d %H:%M:%OS1")
[1] "2012-01-16 12:00:00.2"
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,小数".3"必须最好用二进制数近似,该二进制数略小于"0.300000000000000000" - 类似于"0.29999999999999999".因为strptime并且strftime截断而不是舍入到指定的小数位,如果小数位数设置为1,则0.3将转换为0.2.同样的逻辑适用于您的示例时间,其中一半表现出这种行为,就像(在平均)预计.