在R中调用strptime时毫秒难题

sun*_*unt 6 r strptime

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"那里得到.

Jos*_*ien 9

这与R-FAQ 7.31有关,虽然它采用了与平常不同的幌子.

您看到的行为来自以下组合:(a)二进制计算机的(大多数)十进制值的不精确表示; 和(b)的记录的行为strftimestrptime,这是截断而不是圆形秒的小数部分,以小数位指定数量.

?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.同样的逻辑适用于您的示例时间,其中一半表现出这种行为,就像(在平均)预计.