2012-01-16 27 views
3

で時系列Iは(3分間隔で)、次のOHLCのデータを持っているは、私は次のように使用して、それを集約しようとしていますR

library(tseries) 
library(xts) 
library(quantmod) 
> str(tickmin) 
An ‘xts’ object from 2010-06-30 15:47:00 to 2010-09-08 15:14:00 containing: 
    Data: num [1:8776, 1:5] 9215 9220 9205 9195 9195 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "zv.Open" "zv.High" "zv.Low" "zv.Close" ... 
    Indexed by objects of class: [POSIXct,POSIXt] TZ: 
    xts Attributes: 
NULL 


>tickmin 
2010-09-08 15:02:00  20 
2010-09-08 15:04:00  77 
2010-09-08 15:08:00  86 
2010-09-08 15:11:00   7 
2010-09-08 15:14:00  43 
> start(tickmin) 
[1] "2010-06-30 15:47:00 EDT" 
> end(tickmin) 
[1] "2010-09-08 15:14:00 EDT" 

を集約:

> by <-timeSequence(from = start(tickmin), to = end(tickmin), format="%Y-%m-%d %H%M", by = "day") 
>by 
[61] [2010-08-29 19:47:00] [2010-08-30 19:47:00] [2010-08-31 19:47:00] 
[64] [2010-09-01 19:47:00] [2010-09-02 19:47:00] [2010-09-03 19:47:00] 
[67] [2010-09-04 19:47:00] [2010-09-05 19:47:00] [2010-09-06 19:47:00] 
[70] [2010-09-07 19:47:00] 

> aggregate(Vo(tickmin),by,sum) 
Error: length(time(x)) == length(by[[1]]) is not TRUE 

は、いずれかを感謝..wouldどのように私はエラーを修正することができるかに関する提案。

+0

使用しているパッケージとオブジェクトの構造を明記してください。また、私たちはもっと良い方法で、再現可能な例を投稿してください。 –

+0

例の詳細が必要な場合、私はそれを行うことができます。そうでなければ、再現可能な例のための多くのデータです。 – itcplpl

+0

-1あなたの例は完全に不明です。 'str(tickmin)'は5列のxtsオブジェクトを示しますが、 'tickmin'は次の行にそれを表示するときに1つの列しか持ちません。 'timeSequence'関数は、あなたがリストした3つのパッケージのどれにも存在しません。ありがとう。 –

答えて

19

私はあなたのエラーについて説明し、それを修正する方法を説明しますが、あなたがやっていることをやるためのより良い方法があります。だから私の答えを必ず読んでください!

エラーメッセージから、byの長さはVo(tickmin)と同じではありません。 tickminに対応する値につき1つの値を持つように、byを生成する必要があります。

# generate a set of times from 2010-06-30 onwards at 20 minute intervals 
tms <- as.POSIXct(seq(0,3600*24*30,by=60*20),origin="2010-06-30") 
n <- length(tms) 
# generate volumes for those intervals, random 0 -- 100, turn into xts object 
xts.ts <- xts(sample.int(100,n,replace=T),tms) 
colnames(xts.ts)<-'Volume' 

得られます:

> head(xts.ts) 
        Volume 
2010-06-30 00:00:00  97 
2010-06-30 00:20:00  78 
2010-06-30 00:40:00  38 
2010-06-30 01:00:00  86 
2010-06-30 01:20:00  79 
2010-06-30 01:40:00  55 

は、日付の文字列の全体の束を与えるあなたはindex(xts.ts)を使用xts.tsの日付にアクセスするには

は、ここでは例として、私はxtsオブジェクトを生成します、例えば"2010-07-30 00:00:00 EST"。あなたがas.Dateを使用することができます最も近い日にこれらを丸める

> as.Date(index(xts.ts)) 
    [1] "2010-06-29" "2010-06-29" "2010-06-29" "2010-06-29" "2010-06-29" 
    .... 

ソリューションあなたの問題には

次にやるaggregate使用する:あなたの問題へ

> aggregate(Vo(xts.ts),as.Date(index(xts.ts)),sum) 

2010-06-29 1858 
2010-06-30 3733 
2010-07-01 3906 
2010-07-02 3359 
2010-07-03 3838 
... 

よりよい解決策

xtsパッケージには、関数apply.dailyapply.monthlyなどがあります(どの機能を持っているかは、ls('package:xts')を使ってください)。興味のあるものがあるかもしれません。

apply.daily(x,FUN,...) do 正確にはあなたが望むもの。 ?apply.dailyを参照してください。

> apply.daily(xts.ts,sum) 

        Volume 
2010-06-30 23:40:00 4005 
2010-07-01 23:40:00 4093 
2010-07-02 23:40:00 3419 
2010-07-03 23:40:00 3737 
... 

またはあなたのxtsオブジェクトがOpenCloseなどのような他の列がある場合、あなたはapply.daily(xts.ts, function(x) sum(Vo(x)))を行うことができます:あなたが行うことができ、それを使用するに 。

回答はapply.dailyからaggregate ... as.Dateまでの方法でわずかに異なります。これは、apply.dailystart(xts.ts)からend(xts.ts)(多かれ少なかれ)から毎日が深夜から真夜中にかけて変化したためです。

あなたの質問を見ると、apply.dailyはあなたがしたいことに最も近いと思われます(そして、とにかくxtsと一緒に提供されています。)

+1

私は説明とあなたの解答に感謝します。私は確かにapply.dailyをチェックし、それに取り組むでしょう。 – itcplpl

+1

第1の解決策は、第2の解決策よりも毎日異なる回答を計算する。 2番目は正しく動作するようです。 – mcheema

+0

As Dateには、前日の真夜中から20分後および40分後が含まれます。 – mcheema

関連する問題