period.apply超过一小时决定开始时间

时间:2016-11-21 15:14:06

标签: r xts

所以我在一年中有一个xts time serie with time zone" UTC"。每行之间的时间间隔为15分钟。

                       x1    x2
2014-12-31 23:15:00 153.0   0.0 
2014-12-31 23:30:00 167.1   5.4 
2014-12-31 23:45:00 190.3   4.1 
2015-01-01 00:00:00 167.1   9.7

由于我希望数据超过一小时以便与其他数据集进行比较,因此我尝试使用period.apply

dat <- period.apply(dat, endpoints(dat,on="hours",k=1), colSums)

问题是我的新数据集中的第一行是2014-12-31 23:45:00而不是2015-01-01 00:00:00。我尝试更改端点向量,但不知怎的,它一直说它超出了界限。我也认为这是我的答案:https://stats.stackexchange.com/questions/5305/how-to-re-sample-an-xts-time-series-in-r/19003#19003但事实并非如此。我不想更改列的名称,我想总结一个不同的间隔。

这是一个可重复的例子:

library(xts)
seq<-seq(from=ISOdate(2014,12,31,23,15),length.out = 100, by="15 min", tz="UTC")
xts<-xts(rep(1,100),order.by = seq)
period.apply(xts, endpoints(xts,on="hours",k=1), colSums)

结果如下:

2014-12-31 23:45:00    3
2015-01-01 00:45:00    4
2015-01-01 01:45:00    4
2015-01-01 02:45:00    4

并以此结束:

2015-01-01 21:45:00    4
2015-01-01 22:45:00    4
2015-01-01 23:45:00    4
2015-01-02 00:00:00    1

虽然我希望它总是在相同的时间间隔内总和,这意味着我只想要4s。 (我使用RStudio 0.99.903和R x64 3.3.2)

1 个答案:

答案 0 :(得分:1)

问题在于您使用的是endpoints,但是您希望通过间隔的 start 对齐,而不是结束。我以为你可以使用this startpoints function,但这会产生奇怪的结果。

以下解决方法的基本思路是从所有索引值中减去少量数据,然后使用endpointsperiod.apply进行汇总。然后在结果上调用align.time。我不确定这是否是一般解决方案,但它似乎适用于您的示例。

library(xts)
seq<-seq(from=ISOdate(2014,12,31,23,15),length.out = 100, by="15 min", tz="UTC")
xts<-xts(rep(1,100),order.by = seq)
# create a temporary object
tmp <- xts
# subtract a small amount of time from each index value
.index(tmp) <- .index(tmp)-0.001
# aggregate to hourly
agg <- period.apply(tmp, endpoints(tmp, "hours"), colSums)
# round index up to next hour
agg_aligned <- align.time(agg, 3600)