7

R でのミリ秒の丸めに関する次の問題があるとします。時間が正しくなるようにするにはどうすればよいですか?

> options(digits.secs=3)
> as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.060 UTC"
> as.POSIXlt("13:29:56.062", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.063", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"

この URL は背景情報を提供しますが、私の問題を解決しないことに気付きました: R で strptime を呼び出すときのミリ秒のパズル

また、この URL は問題に触れていますが、解決していません: R xts: .001 millisecond in index

これらの場合、次のことがわかります。

> x <- as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> print(as.numeric(x), digits=20)
[1] 1339075796.0610001087

URL は、これが単なる表示上の問題であることを示しているようにも見えますが"%OS3"、オプション行を使用しないなどのステートメントを使用すると、正しい桁数が取得されないように見えることに気付きました。

私が使用しているバージョンは Windows で 32 ビット 2.15.0 ですが、これは R の他の状況でも存在するようです。

元のデータは CSV ファイル内のこれらの日時文字列であることに注意してください。文字列から正しいミリ秒時間に変換する方法を見つける必要があります。

4

4 に答える 4

5

私はそれを見ません:

> options(digits.secs = 4)
> as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.062", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.062 UTC"
> as.POSIXlt("13:29:56.063", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"
> options(digits.secs = 3)
> as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.062", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.062 UTC"
> as.POSIXlt("13:29:56.063", format = '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"

> sessionInfo()
R version 2.15.0 Patched (2012-04-14 r59019)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=en_GB.utf8    LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=C                LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base

"%OSn"フォーマット文字列を使用すると、強制的に切り捨てられます。小数秒を浮動小数点で正確に表すことができない場合、切り捨てがうまくいかない可能性があります。物事が間違った方向に進んでいる場合は、必要な単位に明示的に丸めるか、操作したい分数の半分を追加することもできます (図の場合0.0005)。

> t1 <- as.POSIXlt("13:29:56.061", format = '%H:%M:%OS', tz='UTC')
> t1
[1] "2012-06-07 13:29:56.061 UTC"
> t1 + 0.0005
[1] "2012-06-07 13:29:56.061 UTC"

(しかし、私は言った、私はここで問題を見ていない。)

この後者の指摘は、2012 年 5 月 30 日に R-Devel メーリング リストで Simon Urbanekによって行われました。

于 2012-06-07T12:54:41.533 に答える
3

これは、 R で strptime を呼び出すときのミリ秒パズルと同じ問題です。

あなたの例:

> x <- as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> print(as.numeric(x), digits=20)
[1] 1339075796.0610001087

問題を代表するものではありません。 as.numeric(x)数値に変換する前に POSIXlt オブジェクトを POSIXct に変換するため、さまざまな浮動小数点精度の丸め誤差が発生します。

print.POSIXltそれは( を呼び出す)方法ではありませんformat.POSIXltformat.POSIXltリスト構造の各要素を個別にフォーマットするPOSIXltため、次を確認する必要があります。

print(x$sec, digits=20)
[1] 56.060999999999999943

そして、その数値は小数点第 3 位で切り捨てられているので、 が表示されます56.060formatこれは、直接呼び出すことで確認できます。

> format(x, "%H:%M:%OS6")
[1] "13:29:56.060999"
于 2012-06-07T14:29:17.727 に答える
1

ミリ秒があります:

 unclass(as.POSIXlt("13:29:56.061", '%H:%M:%OS', tz='UTC'))
 $sec
 [1] 56.061
 ...

(ここで formatを呼び出す必要はありません。これは引数の名前であり、他の関数からの必要な入力ではありません)。

そうしないと再現できません (Windows 64 ビット R 2.15.0):

options(digits.secs = 3)
as.POSIXlt("13:29:56.061", '%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"

sessionInfo()
R version 2.15.0 Patched (2012-05-05 r59321)
Platform: x86_64-pc-mingw32/x64 (64-bit)
...
于 2012-06-07T12:55:56.900 に答える