6
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"

なぜ「009」と「011」と1ミリ秒違うのか不思議です。

4

2 に答える 2

9

これはR-FAQ 7.31に関連していますが、通常とは異なる装いをしています。

表示されている動作は、次の組み合わせの結果です。(a) バイナリ コンピューターによる (ほとんどの) 10 進数値の不正確な表現。(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"

上記の例では、小数の '.3' は、'0.300000000000000000' よりもわずかに小さい 2 進数 ('0.29999999999999999' など) で近似するのが最適です。strptimeandは、指定された小数点以下の桁数に丸めるのではなく切り捨てるためstrftime、小数点以下の桁数が 1 に設定されている場合、0.3 は 0.2 に変換されます。平均)が期待されます。

于 2012-01-17T07:03:59.677 に答える
3

「回答済み」であることは知っていますが、この問題は 32 ビット R にも存在します。32 ビット バージョンと 64 ビット バージョンの間で実装に矛盾があります。切り捨ての問題は部分的に当てはまりますが、strptime 関数の結果ではなく、この特定のケースでは print.POSIXlt メソッドの結果です。

これは、期待される動作を生成する関数で関数を上書きすることによって実証できます。例えば

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"

詳細については、ここでこれをカバーしましたミリ秒の丸めに関するRの問題

于 2015-10-16T01:11:19.533 に答える