2017-04-17 12 views
0

Rを学習する(xtsおよびquantmodパッケージを含む)。私のデータセットがあります:Rは、特定の時刻にデータにquantmodアクセスします。

str(h2) 
‘zoo’ series from 2016-06-15 11:00:00 to 2016-09-15 14:00:00 
    Data: num [1:928, 1:5] 67842 67486 67603 67465 67457 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "X.OPEN." "X.HIGH." "X.LOW." "X.CLOSE." ... 
    Index: POSIXct[1:928], format: "2016-06-15 11:00:00" "2016-06-15 12:00:00" "2016-06-15 13:00:00" ... 

first(h2, '1 day') 
        X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
2016-06-15 11:00:00 67842 67842 67122 67488 262740 
2016-06-15 12:00:00 67486 67610 67420 67603 288875 
2016-06-15 13:00:00 67603 67608 67381 67466 323498 
2016-06-15 14:00:00 67465 67484 67356 67455 168991 
2016-06-15 15:00:00 67457 67460 67289 67361 174965 
2016-06-15 16:00:00 67363 67381 67202 67317 195579 
2016-06-15 17:00:00 67320 67465 67288 67397 230255 
2016-06-15 18:00:00 67397 67436 67084 67099 469379 
2016-06-15 19:00:00 67096 67198 66900 67058 264430 
2016-06-15 20:00:00 67040 67094 66944 67092 110503 
2016-06-15 21:00:00 67092 67158 66877 66992 83041 
2016-06-15 22:00:00 66993 67110 66680 66909 386905 
2016-06-15 23:00:00 66909 67269 66884 67126 143373 

dput(first(h2, '1 day')) 
structure(c(67842, 67486, 67603, 67465, 67457, 67363, 67320, 
67397, 67096, 67040, 67092, 66993, 66909, 67842, 67610, 67608, 
67484, 67460, 67381, 67465, 67436, 67198, 67094, 67158, 67110, 
67269, 67122, 67420, 67381, 67356, 67289, 67202, 67288, 67084, 
66900, 66944, 66877, 66680, 66884, 67488, 67603, 67466, 67455, 
67361, 67317, 67397, 67099, 67058, 67092, 66992, 66909, 67126, 
262740, 288875, 323498, 168991, 174965, 195579, 230255, 469379, 
264430, 110503, 83041, 386905, 143373), .Dim = c(13L, 5L), .Dimnames = list(
    NULL, c("X.OPEN.", "X.HIGH.", "X.LOW.", "X.CLOSE.", "X.VOL." 
    )), index = structure(c(1465977600, 1465981200, 1465984800, 
1465988400, 1465992000, 1465995600, 1465999200, 1466002800, 1466006400, 
1466010000, 1466013600, 1466017200, 1466020800), class = c("POSIXct", 
"POSIXt"), tzone = ""), class = "zoo") 

例えば、このような課題を解決する方法を見つけ出すことはできません - 11時との違いで差(X.CLOSE-X.OPEN)の符号を比較します(X.CLOSE(13:00)-X.OPEN(12:00))をサンプルに含まれています。
この問題を解決する際、私は2つの項目を参照してください:
1)。特定の時間にどのようにデータにアクセスするのですか?私。例えば、私が選択した12時にX.OPENを取得する方法。私はさまざまな組み合わせを試してみましたが、結果はありません(データセットのタイトルのみ)

h2["T11:00:00/12:00:00"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
h2["2016-06-15 11:00:00 MSK"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
x <- h2["2016-06-15 11:00:00 MSK"]  #'zoo' series (without observations) 
x 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
h2["T12:00:00.000/T12:00:00.001"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 

2)です。以前私はExcelで同様のアルゴリズムを作成し、bruteforce(ステップバイチェック)データセットでこの問題を解決しました。しかし、Rにはベクトルデータ型があり、このタスクを解決するにはより速く便利な方法でなければなりません。

+0

ようこそ!質問に[最小限再現可能な例]が含まれていることを確認してください(http://stackoverflow.com/a/5963610/2477097)。コミュニティメンバーが簡単に回答できるようになります。この場合、 'dput(first(h2、 '1 day'))'の出力をポストすると便利です。また、一般的には、コードスニペットにプロンプ​​ト(例: '>')を含めないでください。これにより、実行するコンソールにこのコードを貼り付けることができなくなります。代わりに、コードを直接貼り付け(プロンプトなし)、出力をコメントアウトする必要があります。 –

+0

Alexey!あなたが指摘したように私は私の質問を改善する。 – Dmitry

答えて

0

時系列から特定の時刻にデータを取得するには、windowを使用します。

window(h2, start = as.POSIXct('2016-06-15 04:00'), end = as.POSIXct('2016-06-15 04:59')) 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 04:00:00 67842 67842 67122 67488 262740 

window(h2, start = as.POSIXct('2016-06-15 06:00'), end = as.POSIXct('2016-06-15 08:00')) 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 06:00:00 67603 67608 67381 67466 323498 
# 2016-06-15 07:00:00 67465 67484 67356 67455 168991 
# 2016-06-15 08:00:00 67457 67460 67289 67361 174965 

行番号でアクセスすることもできます。

h2[1,] 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 04:00:00 67842 67842 67122 67488 262740 

h2[4:6,] 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 07:00:00 67465 67484 67356 67455 168991 
# 2016-06-15 08:00:00 67457 67460 67289 67361 174965 
# 2016-06-15 09:00:00 67363 67381 67202 67317 195579 

X.CLOSEの違いを利用してください。 X.OPEN。すべての回で、あなたは遅れ違いを行うには...

h2_diff <- h2[,'X.CLOSE.'] - h2[,'X.OPEN.'] 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 2016-06-15 06:00:00 2016-06-15 07:00:00 
#    -354     117    -137     -10 
# 2016-06-15 08:00:00 2016-06-15 09:00:00 2016-06-15 10:00:00 2016-06-15 11:00:00 
#     -96     -46     77    -298 
# 2016-06-15 12:00:00 2016-06-15 13:00:00 2016-06-15 14:00:00 2016-06-15 15:00:00 
#     -38     52    -100     -84 
# 2016-06-15 16:00:00 
#     217 

を行うことができ、あなたはlag機能を使用することができます。スタックオーバーフローにそうX.CLOSE(n) - X.OPEN(n - 1)を行うには

h2[1:3,'X.CLOSE.'] 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 2016-06-15 06:00:00 
#    67488    67603    67466 

lag(h2[1:3,'X.CLOSE.']) 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 
#    67603    67466 

lag(h2[1:3,'X.CLOSE.'], -1) 
# 2016-06-15 05:00:00 2016-06-15 06:00:00 
#    67488    67603 

...

h2[,'X.CLOSE.'] - lag(h2[,'X.OPEN.'], -1) 
# 2016-06-15 05:00:00 2016-06-15 06:00:00 2016-06-15 07:00:00 2016-06-15 08:00:00 
#    -239     -20    -148    -104 
# 2016-06-15 09:00:00 2016-06-15 10:00:00 2016-06-15 11:00:00 2016-06-15 12:00:00 
#    -140     34    -221    -339 
# 2016-06-15 13:00:00 2016-06-15 14:00:00 2016-06-15 15:00:00 2016-06-15 16:00:00 
#     -4     -48    -183     133 
+0

ありがとう、アレクセイ!あなたが気にしないなら、私はあなたにもう1つの質問をしたいと思います - 自分で決定したデータをどのように入手できますか?たとえば、毎日12:00:00にX.OPENを取得するにはどうすればよいですか?どうもありがとう! – Dmitry

+0

特定の時間を抽出するには、[このスタックオーバーフローの質問](http://stackoverflow.com/questions/16059965/plot-value-over-hour-of-day-with-xts-zoo-r)を参照してください。また、あなたの質問に答えた場合は、矢印の下にあるグレーのチェックマークをクリックして答えを受け入れてください。答えが役に立つと分かった場合は、上向き矢印をクリックしてアップヴォートすることもできます。 –

+0

もう一度ありがとうAlexey!あなたの答えは本当に助けになった – Dmitry

関連する問題