period.apply 一个多小时决定开始时间

period.apply over an hour with deciding start time

所以我有一个带有时区 "UTC" 的全年 xts 时间系列。每行之间的时间间隔为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)

问题是您正在使用 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)