簡體   English   中英

匯總R中的時間序列

[英]aggregating time series in R

我有以下OHLC數據(每隔3分鍾)

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

..會不會對如何解決錯誤提出任何建議。

我會解釋你的錯誤並告訴你如何解決它,但是有更好的方法來做你正在做的事情。 所以一定要讀完我的答案!

從錯誤消息中,您by長度與Vo(tickmin)長度Vo(tickmin) 你必須生成你的by以獲得每個相應值的一個值,以及每天的tickmin

作為一個例子,我生成一個xts對象:

# 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

要訪問xts.ts的日期,請使用index(xts.ts) ,它提供了一大堆日期字符串,例如"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,...) 完全符合你的要求。 ?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.dailyaggregate ... as.Date方法的答案略有不同。 這是因為apply.daily每天從start(xts.ts)end(xts.ts) (或多或少),而aggregate只是從午夜到午夜。

看看你的問題, apply.daily似乎與你想要做的最匹配(並且無論如何都提供了xts ,那么為什么不使用它呢?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM