在测试中我已经指出,这个问题仍然存在32位[R 3.01,并认为这是由于浮点数据的截断特定于32位实现的:你可以通过调用format
直接看到用于POSIXlt日期时间的打印,格式和as.character操作符。
底层数据尚未存储在导致截断的一种情况下(32位)而不是另一种(64位),但“打印”,“格式”和“as.character “POSIXlt类型的函数,专门用于将POSIXlt数据显示为可显示的字符串。
虽然记录的行为是这些函数截断(忽略)额外数字(如@Gavin Simpson所述),但对于32位和64位版本而言,这并非如此。展示;我们将产生1000个不同的时间和执行一些比较操作:
> options(digits.sec=3)
> x = as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> for (i in 0:999) {
> x[i+1] = as.POSIXlt(paste0("13:29:56.",sprintf("%03d",i)),format='%H:%M:%OS',tz='UTC')
> }
> sum(x[2:1000]>x[1:999])
[1] 999
在32位和64位的比较操作是一致的,但是在32位我看到:
> x[1:6]
[1] "2015-10-16 13:29:56.000 UTC" "2015-10-16 13:29:56.000 UTC"
[3] "2015-10-16 13:29:56.002 UTC" "2015-10-16 13:29:56.003 UTC"
[5] "2015-10-16 13:29:56.003 UTC" "2015-10-16 13:29:56.005 UTC"
因此,它是显然是一个显示问题。在POSIXlt数据类型看实际的数字,尤其是秒,我们可以看到什么似乎发生:
> y = (x[1:6]$sec)
> y
[1] 56.000 56.001 56.002 56.003 56.004 56.005
> trunc(y*1000)/1000
[1] 56.000 56.001 56.002 56.003 56.004 56.005
> trunc((y-floor(y))*1000)/1000
[1] 0.000 0.000 0.002 0.003 0.003 0.005
我认为,这是一个应该被固定在底层基础库中的缺陷,作为一个临时的解决办法不过,您可以覆盖“打印”,“as.character”和“格式”功能以将输出更改为所需的输出,例如
format.POSIXlt = function(posix) {
return(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)))
}
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)))
}
as.character.POSIXlt = function(posix) {
return(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)))
}
格式()在这里的使用是不必要和分散注意力。 。 。 – mdsumner
好的,但我们需要'format ='%H:%M:%OS'。 –
另请参阅http://stackoverflow.com/a/7730759/210673 – Aaron