5

午前 9 時 50 分に開始する日中データを使用しており、それを 20 分の時間間隔に変換したいので、最初の期間は 09:50 から 10:09:59 まで、2 番目の期間は 10 からになります。 10to.minutes()から10:29:59などxts。おそらく通常のリクエストではないことはわかっています...しかし、正しいエンドポイントを持つように、つまり最初のタイムスタンプに基づいて、これを行う方法はありますか?

ボーナスポイントについて...最終タイムスタンプに基づいてそれを行う方法はありますか? (つまり、そのタイムスタンプからさかのぼって期間エンドポイントを生成しますか?

これは、10分であるという私のポイントの図です(私が望むものから)

x <- xts(rnorm(24*60*60), as.POSIXct(format(paste(Sys.Date(),'09:50')))-((24*60*60):1))
head(x)
x1 <- to.minutes(x, 20)
head(x1)

スプリット、カット、lapplys do.calls および rbinds を使用してこれを修正する方法を考えることができます....しかし、基本的には OHLC オブジェクトを再作成することになります...そして、既存のものと比較して非効率的である可能性があると感じています。ソリューション...

4

2 に答える 2

6

これは、xtsのドキュメントでもっと目立つはずの便利なトリックです。

xtsオブジェクトから始める

R> set.seed(42)   ## fix seed
R> X <- xts(cumsum(rnorm(100))+100, order.by=Sys.time()+cumsum(runif(100)))
R> head(X)
                              [,1]
2012-10-05 06:42:20.299761 101.371
2012-10-05 06:42:20.816872 100.806
2012-10-05 06:42:21.668803 101.169
2012-10-05 06:42:22.111599 101.802
2012-10-05 06:42:22.269479 102.207
2012-10-05 06:42:22.711804 102.100

この不規則な系列を考えると、課す一定の間隔でサブセット化する必要があります。ここでは、2秒間隔を作成します。インデックスと同じタイプであれば、他のものはすべて機能しますPOSIXct

R> ind <- seq(start(X) - as.numeric(start(X)-round(start(X))) + 1, 
+             end(X), by="2 secs")
R> head(ind)
[1] "2012-10-05 06:42:21 CDT" "2012-10-05 06:42:23 CDT" 
[3] "2012-10-05 06:42:25 CDT" "2012-10-05 06:42:27 CDT" 
[5] "2012-10-05 06:42:29 CDT" "2012-10-05 06:42:31 CDT"
R> 

ここでの秘訣は、通常のシリーズを不規則なシリーズとマージし、na.locf()それを呼び出して最後の適切な不規則なobsを新しいタイムグリッドに呼び出し、次にタイムグリッドでサブセット化することです。

R> na.locf(merge(X, xts(,ind)))[ind]
                           X
2012-10-05 06:42:21 100.8063
2012-10-05 06:42:23 102.1004
2012-10-05 06:42:25 105.4730
2012-10-05 06:42:27 107.2635
2012-10-05 06:42:29 104.9588
2012-10-05 06:42:31 101.7505
2012-10-05 06:42:33 104.6884
2012-10-05 06:42:35 103.6441
2012-10-05 06:42:37 101.6476
2012-10-05 06:42:39  98.6246
2012-10-05 06:42:41  97.9922
2012-10-05 06:42:43  97.7545
2012-10-05 06:42:45 101.0187
2012-10-05 06:42:47  98.0331
2012-10-05 06:42:49 100.7752
2012-10-05 06:42:51 103.0702
2012-10-05 06:42:53 102.6578
2012-10-05 06:42:55 103.1342
2012-10-05 06:42:57 103.4714
2012-10-05 06:42:59 102.3683
2012-10-05 06:43:01 105.0394
2012-10-05 06:43:03 103.9775
R> 

出来上がり。

于 2012-10-05T11:46:13.773 に答える
4

最近、同様の課題がありました (午後 5 時までに FX データを分割する)。テスト データから始めます。

library(xts)
set.seed(42)
x <- xts(rnorm(24*60*60), as.POSIXct(format(paste(Sys.Date(),'09:50')))-((24*60*60):1))

10 分前に移動し、分割を実行してから、分割されたデータを 10 分前に移動します。

offset <- 600
index(x) <- index(x) - offset
x1 <- to.minutes(x, 20)
index(x1) <- index(x1) + offset

(注:これは破損しxます。コピーで作業するか、index(x) <- index(x) + offset後で作業します)。x1次のようになります。

                        x.Open   x.High     x.Low    x.Close
2012-10-06 10:09:59  1.3709584 3.495304 -3.371739  0.4408241
2012-10-06 10:29:59 -0.7465165 3.584659 -2.828475  0.5938161
2012-10-06 10:49:59  1.3275046 3.174520 -3.199558 -0.6273660
...
2012-10-07 09:09:59 -0.83742490 3.103466 -3.251721 -1.093380
2012-10-07 09:29:59 -0.48464537 3.228048 -3.113351 -1.572931
2012-10-07 09:49:59  1.90503697 3.420940 -3.505207  2.832325

マジック ナンバー 600 が表示されたのは、最後のティックが前の 20 分間の境界から 600 秒だったからです。動的に計算する方法は次のとおりです。

offset <- ( as.integer(last(index(x))) %% 1200 ) + 1

as.integer最後のティックの時刻を secs-since-1970 形式に変換します。(as.numericタイムスタンプにミリ秒がある場合に使用します。) %%120020 分境界に切り捨てます。最後に、はXX:XX:00 を前のバーの終わりではなく、1 つのバーの開始+1として扱うためです。to.minutes

于 2012-10-07T01:47:33.727 に答える