在R中调用strtime时的毫秒谜题

在R中调用strtime时的毫秒谜题,r,strptime,R,Strptime,我不明白为什么“009”和“011”之间会有一毫秒的差异。这与“009”有关,尽管它的外表与通常不同 您看到的行为是由以下因素组合而成:(a)二进制计算机对(大多数)十进制值的不精确表示;和(b)strftime和strftime的记录行为,即将秒的小数部分截断而不是四舍五入到指定的小数位数 从?strtime帮助文件(关键字为“截断”): 特定于R的是“%OSn”,对于输出,它给出秒数 被截断为“0我知道它已被“回答”,但对于32位R,此问题仍然存在,32位和64位版本之间的实现不一致。截断问

我不明白为什么“009”和“011”之间会有一毫秒的差异。这与“009”有关,尽管它的外表与通常不同

您看到的行为是由以下因素组合而成:(a)二进制计算机对(大多数)十进制值的不精确表示;和(b)
strftime
strftime
的记录行为,即将秒的小数部分截断而不是四舍五入到指定的小数位数

?strtime
帮助文件(关键字为“截断”):

特定于R的是“%OSn”,对于输出,它给出秒数 被截断为“0我知道它已被“回答”,但对于32位R,此问题仍然存在,32位和64位版本之间的实现不一致。截断问题在一定程度上是正确的,但它不是由strtime函数引起的,而是在这种特殊情况下由print.POSIXlt方法引起的

这可以通过使用产生预期行为的函数覆盖函数来证明。例如

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"
现在,时间按预期显示:

print.POSIXlt = function(posix) {
    print(paste0(posix$year+1900,"-",sprintf("%02d",posix$mon+1),"-",sprintf("%02d",posix$mday)," ",
       sprintf("%02d",posix$hour),":",sprintf("%02d",posix$min),":",sprintf("%002.003f",posix$sec)))
    }

关于进一步的细节,我已经在这里介绍过了

您可能希望包括来自
sessionInfo
的输出,因为我无法重现这种行为,所以您的R版本、操作系统等可能与此相关。适用于64位Ubuntu 11.10上的R-2.14.1。你试过重新启动你的计算机吗?FWIW,我得到了与OP相同的行为,在Windows机器上使用R-2.14.1。我可以在32位Windows XP上使用R-2.14.1进行复制。未来的读者可能也会对这个问题感兴趣出于好奇,你知道为什么Joshua和我不能在Ubuntu和OSX上复制它吗?@joran:这可能是32位和64位架构的问题吗?我可以在FC16 32位上复制这个问题,所以看起来不太可能是操作系统问题…@joran——不,我没有那么渊博,尽管我很感兴趣。我想知道,从
?strftime
帮助文件的更深处看,这是否是一条线索:
其他转换规范(即使以“%”开头的其他字符序列是转换规范)的行为是系统特定的。
@nico--这是一个有趣的想法。尽管如此,我仍然认为对于64位机器上的二进制表示,应该存在相同的基本限制,尽管被截断的特定值可能很容易不同。我想知道joran或Joshua Ulrich是否在OP的问题中看到任何分数秒的向下截断。我无法在OSX(Lion或SL)中使用R 2.14.0或2.14.1(均为64位)复制它(对于任何示例)。所以它可能是一个32对64位的东西。我必须尝试32位构建的OSX。。。
print.POSIXlt = function(posix) {
    print(paste0(posix$year+1900,"-",sprintf("%02d",posix$mon+1),"-",sprintf("%02d",posix$mday)," ",
       sprintf("%02d",posix$hour),":",sprintf("%02d",posix$min),":",sprintf("%002.003f",posix$sec)))
    }
> strptime("2007-03-30 15:00:00.009", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:0.009"