n.e*_*e.w 6 r time-series quantitative-finance zoo xts
例如,假设您xts
从上午9:30到下午4:30 ,每天1分钟的仪器x数据的数据为10年,如下(格式):
Date.Time Volume
2001-01-01 09:30:00 1200
2001-01-01 09:31:00 1110
2001-01-01 09:32:00 1303
Run Code Online (Sandbox Code Playgroud)
一直到:
2010-12-20 16:28:00 3200
2010-12-20 16:29:00 4210
2010-12-20 16:30:00 8303
Run Code Online (Sandbox Code Playgroud)
我想要:
我该怎么做才能最好:
我有一个很好的戳周围aggregate
,sapply
,period.apply
功能等,但只是似乎无法"bin"的数据正确.
用循环解决这个问题很容易,但速度很慢.我宁愿避免使用程序化解决方案并使用利用C++架构的功能(即xts
基于解决方案)
有人可以提供一些建议/解决方案吗?
非常感谢提前.
首先让我们创建一些测试数据:
library(xts) # also pulls in zoo
library(timeDate)
library(chron) # includes times class
# test data
x <- xts(1:3, timeDate(c("2001-01-01 09:30:00", "2001-01-01 09:31:00",
"2001-01-02 09:30:00")))
Run Code Online (Sandbox Code Playgroud)
1)aggregate.zoo.现在尝试将其转换为times
类并使用此单行聚合:
aggregate(as.zoo(x), times(format(time(x), "%H:%M:%S")), mean)
Run Code Online (Sandbox Code Playgroud)
1a)aggregate.zoo(变体).或者这种变化将较短的聚合系列转换times
为避免必须在较长的原始系列上进行:
ag <- aggregate(as.zoo(x), format(time(x), "%H:%M:%S"), mean)
zoo(coredata(ag), times(time(ag)))
Run Code Online (Sandbox Code Playgroud)
2)tapply.另一种选择tapply
可能更快:
ta <- tapply(coredata(x), format(time(x), "%H:%M:%S"), mean)
zoo(unname(ta), times(names(ta)))
Run Code Online (Sandbox Code Playgroud)
编辑:简化(1)并添加(1a)和(2)