7

ファイルに文字の日時列があります。ファイルを(にdata.table)ロードし、列をに変換する必要があることを実行しますPOSIXct。次に、値をファイルに書きPOSIXct戻す必要がありますが、日時は同じではありません(正しく印刷されていないため)。

この印刷/フォーマットの問題はよく知られており、何度か議論されてきました。この問題を説明するいくつかの投稿を読みました。私が見つけた最も信頼できる答えは、この質問への回答です。その質問への回答は、この問題を解決することになっている2つの関数(myformat.POSIXctおよびform)を提供しますが、これらはこの例では機能しないようです。

x <- "04-Jan-2013 17:22:08.139"
options("digits.secs"=6)
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS3")
[1] "04-Jan-2013 17:22:08.138"
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS4")
[1] "04-Jan-2013 17:22:08.1390"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=3)
[1] "2013-01-04 17:22:08.138"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=4)
[1] "2013-01-04 17:22:08.1390"

私のsessionInfo

R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                        
[5] LC_TIME=C                              

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

other attached packages:
[1] fasttime_1.0-0   data.table_1.8.9 bit64_0.9-2      bit_1.1-9
[5] sas7bdat_0.3     chron_2.3-43     vimcom_0.9-6    

loaded via a namespace (and not attached):
[1] tools_2.15.2
4

4 に答える 4

5

だから私はあなたがここで私の提案に少しファッジファクターを追加する必要があると思います:https ://stackoverflow.com/a/7730759/210673 。これは機能しているようですが、おそらく他のバグが含まれている可能性があります。重要なことに使用する前に、注意深くテストし、それが何をしているのかを考えてください。

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) + 10^(-digits-1)
  format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}
于 2013-03-13T16:44:17.473 に答える
4

あなたがリンクした質問への答えがすでに言っているように、値がどのように印刷/フォーマットされるかは実際の値同じではありません。これは単なる印刷された表現の問題です。

R> as.POSIXct('2011-10-11 07:49:36.3')-as.POSIXlt('2011-10-11 07:49:36.3')
Time difference of 0 secs
R> as.POSIXct('2011-10-11 07:49:36.2')-as.POSIXlt('2011-10-11 07:49:36.3')
Time difference of -0.0999999 secs

POSIXct正しくないよりも正確ではないあなたの理解POSIXltPOSIXltまた、data.frameの列としてオブジェクトを含めることはできないと言っているのも誤りです。

R> x <- data.frame(date=Sys.time())
R> x$date <- as.POSIXlt(x$date)
R> str(x)
'data.frame':   1 obs. of  1 variable:
 $ date: POSIXlt, format: "2013-03-13 07:38:48"
于 2013-03-13T12:41:55.937 に答える
3

あなたが書くとき

私の理解では、POSIXct表現はPOSIXlt表現よりも精度が低くなります

あなたは明らかに間違っています。

これは、Windowsではミリ秒まで、他のOSでは(ほぼ)マイクロ秒までの両方で同じ表現です。読みましたhelp(DateTimeClasses)か?

最後の質問ですが、私のRcppBDTパッケージの開発バージョンはBoost Date.Timeを使用しており、OSがそれサポートし、適切な表現をオンにした場合、ナノ秒まで到達できます。ただし、POSIXctに置き換わるものであり、時間オブジェクトのベクトルはまだサポートされていません。

編集:フォローアップの質問について:

R> one <- Sys.time(); two <- Sys.time(); two - one
Time difference of 7.43866e-05 secs
R>
R> as.POSIXlt(two) - as.POSIXlt(one)
Time difference of 7.43866e-05 secs
R> 
R> one    # options("digits.sec"=6) on my box
[1] "2013-03-13 07:30:57.757937 CDT"
R> 

編集2: コンピュータでの浮動小数点表現が不正確であることを単に経験していると思います:

R> print(as.numeric(as.POSIXct("04-Jan-2013 17:22:08.138",
+                   format="%d-%b-%Y %H:%M:%OS")), digits=18)
[1] 1357341728.13800001
R> print(as.numeric(as.POSIXct("04-Jan-2013 17:22:08.139",
+                   format="%d-%b-%Y %H:%M:%OS")), digits=18)
[1] 1357341728.13899994
R> 

あなたが想定したように、違いは正確には1/1000ではありません。

于 2013-03-13T11:45:53.750 に答える
3

2つのこと:

1)@statquantは正しい(そして他の方法で知られている専門家の@JoshuaUlrichと@DirkEddelbuettelは間違っている)、そして@Aaronは彼のコメントにあるが、それはここでの主な質問にとって重要ではないだろう:

POSIXltPOSIXct設計上、保存時間は次場合よりも確実に正確です。秒は常に[0、60)であるため、粒度は約6e-15、つまり6フェムト秒になりますPOSIXct

ただし、これはここではあまり関係ありません(現在のRの場合):ほとんどすべての操作、特に数値操作は、グループメソッドを使用します(はい、初心者に はわかりOpsませんが、十分に文書化されています)。Ops.POSIXt最初に強制しPOSIXctます。さらに、format()/ print()ingは、「。」の後に小数点以下6桁を使用します。POSIXltせいぜい、したがって、の内部的に高い精度と「唯一の」100ナノ秒の粒度を区別しませんPOSIXct
(上記の理由により、DirkとJoshuaの両方が誤った主張につながりました。すべての単純な実際の使用では、*ltと*ctの精度は同じになります)。

2)私は、私たち(R Core)がPOSIXtオブジェクトのそのような数分の1のformat()ingを改善する必要があることに同意する傾向があります(上記の@Aaronによって言及されたバグ修正後も)。 しかし、私は間違っているかもしれません、そして「私たち」は「正しい」のいくつかの定義によってそれを正しくしました;-)print()

于 2018-08-11T15:53:35.060 に答える