1

データ ポイント (金融ティック、実験記録など) の csv ファイルがありますが、データのタイムスタンプが重複しています。問題を示すコードは次のとおりです。

library(zoo);library(xts)

csv="2011-11-01,50
2011-11-02,49
2011-11-02,48
2011-11-03,47
2011-11-03,46
2011-11-03,45
2011-11-04,44
2011-11-04,43
2011-11-04,42
2011-11-04,41
"

z1=read.zoo(textConnection(csv),sep=',')
w1=to.weekly(z1)
ep=endpoints(z1,"weeks",1)
w1$Volume=period.apply(z1,ep,length)

z2=read.zoo(textConnection(csv),sep=',',aggregate=T)
w2=to.weekly(z2)
ep=endpoints(z2,"weeks",1)
w2$Volume=period.apply(z2,ep,length)

vignette('zoo-faq')、エントリ 1 は、aggregate=T が動物園の迷惑な警告メッセージを取り除くことを教えてくれます。しかし、結果は次のように変わります。

> w1
           z1.Open z1.High z1.Low z1.Close Volume
2011-11-04      50      50     41       41     10
> w2
           z2.Open z2.High z2.Low z2.Close Volume
2011-11-04      50      50   42.5     42.5      4

警告メッセージを取り除き、それでも w1 と同じ結果を得る別の方法はありますか? (はい、私は以前に使用していたsuppressWarnings()について知っていますが、私はその考えが嫌いです。)(毎日のOHLCVデータを返すカスタム集計関数をread.zooに渡すことについて疑問に思っていました...しかし、それが可能であったとしてもうまくいきませんでした.)

4

2 に答える 2

4

タイムスタンプを「イプシロン」インクリメントでパディングして、それらを異なるものにする関数が必要です。

そのために、Rcpp ベースの関数を 1 つまたは 2 つ作成しました。結局のところ、時間は実際には浮動小数点数である POSIXct であることが最も多いas.numericため (実行後)、タイムスタンプをループし、前のタイムスタンプと等しい場合は、POSIXct 自体よりも小さい 1.0e-7 の小さなデルタを追加し続けます。表すことができます。実際の休憩があるたびに、累積デルタをリセットします。

編集: xts パッケージのmake.index.unique()and関数を試してください:make.time.unique()

R> sametime <- rep(Sys.time(), 3)
R> xts(1:3, order.by=make.time.unique(sametime))
                           [,1]
2011-12-20 06:52:37.547299    1
2011-12-20 06:52:37.547300    2
2011-12-20 06:52:37.547301    3
R> 

編集 2:Dateインデックス付きオブジェクト の別の例を次に示します。

R> samedate <- rep(Sys.Date(), 5)   # identical dates
R> xts(1:5, order.by=make.time.unique(as.POSIXct(samedate)))
                           [,1]
2011-12-19 18:00:00.000000    1
2011-12-19 18:00:00.000000    2
2011-12-19 18:00:00.000001    3
2011-12-19 18:00:00.000002    4
2011-12-19 18:00:00.000003    5
R> xts(1:5, order.by=as.Date(make.index.unique(as.POSIXct(samedate))))
           [,1]
2011-12-20    1
2011-12-20    2
2011-12-20    3
2011-12-20    4
2011-12-20    5
R> 

最初の解決策は POSIXct に切り替えます。これは、GMT から 6 時間を引いた時間が私のローカル タイムゾーンであるため、真夜中の 6 時間前に終了します。Date2 番目の例では、二重の変換を使用して、 --- に戻し、これを一意にしています。

于 2011-12-20T04:32:31.153 に答える
2

Dirkの提案の単純な変形として、これはうまくいくはずです

z0 = read.csv( textConnection(csv), sep=',', header=FALSE )
z1 = zoo( z0$V2, as.Date(z0$V1) + (1:nrow(z0))*10^-10 )
于 2011-12-20T08:26:47.980 に答える