POSIXltの日付時刻のためのprint、format、およびas.character演算子。
下位のデータは、1つのケース(32ビット)ではトランケートにつながるタイプではなく、他のタイプ(64ビット)ではなく、「print」、「format」および「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
私は、これは一時的な修正として、基礎となるライブラリ内に固定されなければならないバグであることを示唆していますただし、 "print"、 "as.character"、 "format"関数を上書きして出力を希望の出力に変更することができます。
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)))
}
ここでformat()を使用する必要はなく、気を散らす。 。 。 – mdsumner
そうですが、 'format = '%H:%M:%OS''が必要です。 –
も参照してください。http://stackoverflow.com/a/7730759/210673 – Aaron