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,但结果很奇怪。
下面解决方法的基本思想是从所有索引值中减去少量,然后使用 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)
所以我有一个带有时区 "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,但结果很奇怪。
下面解决方法的基本思想是从所有索引值中减去少量,然后使用 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)