2

重複の可能性:
R が小数秒で POSIXct をフォーマットする方法

「R が小数秒で POSIXct をフォーマットする方法」に関するこの質問に精通しています。そこには、マイクロ秒を扱うときに POSIXct に数値エラーがあるかどうかに関する議論が続きます。

マイクロ秒のエラーなしで処理できる xts 機能のセット全体を再実装する前に (xts に問題はありません - POSIXct が必要だっただけです)、次のことを確認したかっただけです。

次の行の出力が 4.577894 になるのはなぜですか?

as.POSIXlt(as.POSIXct(sprintf("%s",(format(as.POSIXct("2012-12-14 15:42:04.577895 EDT"), "%Y-%m-%d %H:%M:%OS6")))))$sec

どうもありがとう!

EDIT

この背後にある理由は次のとおりです。ファイルから時間エントリを読み取ったり、何らかの処理を行ったり、ファイルに再度書き込んだり、再度読み取ったりすると、累積エラーが発生します。だから - これは「トリック」の質問ではありませんが、実際には何時間ものデバッグの後に来ます..

4

2 に答える 2

3

この質問は長すぎます。特に、質問自体が回答にリンクしていることを考えると。

これは出力表現の問題であり、よく知られています。時間値の丸めには意味があります。場合によっては、誤った結果を得ることなくサブ秒の値を丸めることができません。

解決策はここにあります(質問にリンクされているように): Rが小数秒でPOSIXctをフォーマットする方法

アーロンの優れた答えから直接盗む:

myformat.POSIXct <- function(x, digits=0) {
  x2 <- round(unclass(x), digits)
  attributes(x2) <- attributes(x)
  x <- as.POSIXlt(x2)
  x$sec <- round(x$sec, digits)
  format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}

x <- as.POSIXct("2012-12-14 15:42:04.577895 EDT")

あなたが試みていること:

as.POSIXlt(as.POSIXct(sprintf("%s",(format(x, "%Y-%m-%d %H:%M:%OS6")))))$sec
## [1] 4.577894

アーロンのコード:

myformat.POSIXct(x, 6)
## [1] "2012-12-14 15:42:04.577895"

sprintf1 秒未満の値をフォーマットするためにフォーマット文字列 ofを使用することを考えるかもしれませんが%.06f、値が整数よりわずかに小さい場合、これは失敗します。

sprintf('%.06f', .9999999)
## [1] "1.000000"

サブ秒の値が切り上げられる場合、POSIXlt に変換すると、秒、分などに適切にロールオーバーされます。

これがデータの問題ではないことを示すには:

y <- as.numeric(x)
y
## [1] 1355521324.5778949261
sprintf('%06f', y - floor(y))
## [1] "0.577895"
于 2013-02-05T14:37:46.310 に答える
0

あなたの問題に対する答えは、あなたが参照したSOの質問のコメントに記載されていると思います。問題は、POSIXct または POSIXlt への変換に丸めが含まれていることです。あなたの値と変換権自体に小さなオフセットを追加するだけです。

# Original value
format(as.POSIXct("2012-12-14 15:42:04.577895 EDT"), "%Y-%m-%d %H:%M:%OS6")
[1] "2012-12-14 15:42:04.577894"

# Original value + offset
format(as.POSIXlt("2012-12-14 15:42:04.5778951 EDT"), "%Y-%m-%d %H:%M:%OS6")
[1] "2012-12-14 15:42:04.577895"

次のように、正規表現を使用してオフセットを追加することをお勧めします。

gsub(" (\\w+)$","1 \\1","2012-12-14 15:42:04.577895 EDT")
[1] "2012-12-14 15:42:04.5778951 EDT"
于 2013-02-04T13:21:24.090 に答える