在測試中我已經指出,這個問題仍然存在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