汇总R中的时间序列

时间:2012-01-16 21:42:21

标签: r aggregate-functions time-series

我有以下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

..会对如何解决错误提出任何建议。

1 个答案:

答案 0 :(得分:23)

我会解释你的错误并告诉你如何解决它,但有一种更好的方法来做你正在做的事情。所以请务必阅读我的全部答案!

从错误消息中,by的长度与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.daily包有apply.monthlyls('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

或者,如果您的Open对象包含其他列,例如Closeapply.daily(xts.ts, function(x) sum(Vo(x)))等,则可以执行apply.daily

请注意,使用aggregate ... as.Date apply.daily方法的答案略有不同。这是因为start(xts.ts)每天从end(xts.ts)发送到aggregate(或多或少),而apply.daily只是从午夜到午夜。{/ p>

查看您的问题,xts似乎与您想要做的最匹配(并且无论如何都提供{{1}},那么为什么不使用它?)