所以我在一年中有一个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)
答案 0 :(得分:1)
问题在于您使用的是endpoints
,但是您希望通过间隔的 start 对齐,而不是结束。我以为你可以使用this startpoints
function,但这会产生奇怪的结果。
以下解决方法的基本思路是从所有索引值中减去少量数据,然后使用endpoints
和period.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)