R 按时钟时间聚合带时间戳的zoo对象(即,不只是按zoo对象中的时间)
我有一个zoo对象,它由一个时间戳(到第二个)时间序列组成。时间序列是不规则的,因为值之间的时间间隔不是规则间隔的 我想将不规则间隔的timeseries对象转换为规则间隔的对象,其中值之间的时间间隔是一个常数,例如15分钟,并且是“真实世界”的时钟时间 一些样本数据可能有助于进一步说明R 按时钟时间聚合带时间戳的zoo对象(即,不只是按zoo对象中的时间),r,aggregation,zoo,R,Aggregation,Zoo,我有一个zoo对象,它由一个时间戳(到第二个)时间序列组成。时间序列是不规则的,因为值之间的时间间隔不是规则间隔的 我想将不规则间隔的timeseries对象转换为规则间隔的对象,其中值之间的时间间隔是一个常数,例如15分钟,并且是“真实世界”的时钟时间 一些样本数据可能有助于进一步说明 # Sample data 2011-05-05 09:30:04 101.32 2011-05-05 09:30:14 100.09 2011-05-05 09:30:19 99.89 2011-05-05
# Sample data
2011-05-05 09:30:04 101.32
2011-05-05 09:30:14 100.09
2011-05-05 09:30:19 99.89
2011-05-05 09:30:35 89.66
2011-05-05 09:30:45 95.16
2011-05-05 09:31:12 100.28
2011-05-05 09:31:50 100.28
2011-05-05 09:32:10 98.28
我希望在每个指定的时间段(例如30秒的时间段)聚合它们(使用我的自定义函数),以便输出如下表所示
关键是我想按时钟时间每30秒聚合一次,而不是从我第一次观察开始的30秒。当然,第一个时间段将是我在要聚合的数据中记录了观察值(即行)的第一个时间段
2011-05-05 09:30:00 101.32
2011-05-05 09:30:30 89.66
2011-05-05 09:31:00 100.28
在给出的示例中,我的自定义聚合函数只返回要聚合的“所选行”的“集合”中的第一个值。我只需将时间截断为间隔,因此假设
t
是时间(如果不是,则使用as.POSIXct
)
然后,您可以在bucket
上进行聚合,如aggregate(值、列表(bucket)、总和)
(我不使用
zoo
所以这是纯R)你应该在xts
中查看align.time
。它做的事情非常接近你想要实现的目标
my.data <- read.table(text="date,x
2011-05-05 09:30:04,101.32
2011-05-05 09:30:14,100.09
2011-05-05 09:30:19,99.89
2011-05-05 09:30:35,89.66
2011-05-05 09:30:45,95.16
2011-05-05 09:31:12,100.28
2011-05-05 09:31:50,100.28
2011-05-05 09:32:10,98.28", header=TRUE, as.is=TRUE,sep = ",")
my.data <- xts(my.data[,2],as.POSIXlt(my.data[,1],format="%Y-%m-%d %H:%M:%S"))
library(xts)
res <-align.time(my.data,30)
res[!duplicated(index(res)),]
[,1]
2011-05-05 09:30:30 101.32
2011-05-05 09:31:00 89.66
2011-05-05 09:31:30 100.28
2011-05-05 09:32:00 100.28
2011-05-05 09:32:30 98.28
my.data我希望我们可以假设这是在zoo或xts对象中。如果是这样,请尝试以下方法:
# First get a start for a set of intervals, need to use your tz
beg<- as.POSIXct( format(index(dat[1,]), "%Y-%m-%d %H:%M", tz="EST5EDT"))
# Then create a sequence of 30 second intervals
tseq <- beg+seq(0,4*30, by=30)
# Then this will creat a vector than you can use for your aggregation fun
findInterval(index(dat), tseq)
#[1] 1 1 1 2 2 3 4 5
# To find the first row in a subset of rows from tapply, try "[" with 1
tapply(dat, findInterval(index(dat), tseq), "[", 1)
# 1 2 3 4 5
#101.32 89.66 100.28 100.28 98.28
#首先开始一组时间间隔,需要使用您的tz
beg读取数据,然后按分钟进行聚合:
Lines <- "2011-05-05 09:30:04 101.32
2011-05-05 09:30:14 100.09
2011-05-05 09:30:19 99.89
2011-05-05 09:30:35 89.66
2011-05-05 09:30:45 95.16
2011-05-05 09:31:12 100.28
2011-05-05 09:31:50 100.28
2011-05-05 09:32:10 98.28"
library(zoo)
library(chron)
toChron <- function(d, t) as.chron(paste(d, t))
z <- read.zoo(text = Lines, index = 1:2, FUN = toChron)
aggregate(z, trunc(time(z), "00:01:00"), mean)
简洁的代码。。。差不多了,但我想每30秒聚合一次,而不是每分钟。用30秒替换对1分钟的引用。我是否遗漏了什么?。我看不到(自定义)聚合正在哪里进行。。。结果看起来是正确的,但我看不出使用上面的代码片段是如何实现的。您没有告诉我们您希望如何聚合(平均值,VWAP…)。我做了和你一样的事情:每30秒只选择第一次交易。这就是!重复的
可以。我永远不会想到尝试这种方法。有趣的。。。顺便说一句,你能解释一下为什么在创建序列时使用4*30吗。我不明白那部分。你需要一个比你上次观察的时间更长的结束时间。如果您想计算它(您可能应该),那么您需要使用max(index(dat))+30来确保findInterval的区间向量足够长。
Lines <- "2011-05-05 09:30:04 101.32
2011-05-05 09:30:14 100.09
2011-05-05 09:30:19 99.89
2011-05-05 09:30:35 89.66
2011-05-05 09:30:45 95.16
2011-05-05 09:31:12 100.28
2011-05-05 09:31:50 100.28
2011-05-05 09:32:10 98.28"
library(zoo)
library(chron)
toChron <- function(d, t) as.chron(paste(d, t))
z <- read.zoo(text = Lines, index = 1:2, FUN = toChron)
aggregate(z, trunc(time(z), "00:01:00"), mean)
(05/05/11 09:30:00) (05/05/11 09:31:00) (05/05/11 09:32:00)
97.224 100.280 98.280