我以1分钟的采样率生成时间序列数据
library(xts)
#create timestamp with 1 mintue sampling rage
timerange <- seq(as.POSIXct("2016-06-09"),as.POSIXct("2016-06-22 23:59:59"), by = "1 min")
# create xts object
data_xts <- xts(rnorm(length(timerange),200,5),timerange)
现在,我想重新采样(更改采样率)到50分钟的速率。所以,我创建了一个自定义函数:
resample_data_minutely_daywise <- function(data_xts,xminutes) {
day_data <- split.xts(data_xts,"days",k=1) # divide data daywise
# Now resample data according to parameter xminutes
day_list <- lapply(day_data, function(x) {
ds_data <- period.apply(x,INDEX = endpoints(index(x), on = "minutes", k = xminutes ), FUN= mean)
align_data <- align.time(ds_data,xminutes*60) # aligning to x seconds
return(align_data)
})
return(day_list)
}
此功能将时间序列数据和所需的采样频率作为输入。接下来,它每天分割数据,最后每天通过取平均值来改变采样。
现在,只要我将此函数称为
p <- resample_data_minutely_daywise(data_xts,50)
sapply(p,length) # check no. of observations in each day
输出结果为:
sapply(p,length) # check no. of observations in each day
[1] 30 30 30 29 29 30 30 30 29 29 30 30 30 29
这表明并非每天都包含相同数量的读数。几天包含29个,一些包含30个观察值。这种未知行为的原因是什么?注意每当我在10,20,30,60分钟重新采样时,每天都包含相同数量的读数。这个问题只有在我尝试50分钟时才会发生。
答案 0 :(得分:1)
您的问题是period.apply()
使用endpoints()
查找中断的位置,endpoints()
输出始终偏离UNIX纪元/起源(1970-01-01 00:00 :00)。但是你想让休息时间从当天午夜开始抵消。
您仍然可以使用period.apply()
执行此操作,但您需要计算自定义断点。在您的情况下,您可以通过查找从xminutes
的倍数开始的秒数来做到这一点。
resample_data_minutely_daywise <- function(data_xts,xminutes) {
day_data <- split.xts(data_xts,"days",k=1) # divide data daywise
# Now resample data according to parameter xminutes
day_list <- lapply(day_data, function(x) {
timeT <- .index(x) - .index(x)[1]
# when does timeT cross a multiple of xminutes?
ep <- which(timeT %% (xminutes * 60) <= 0)
# endpoints must start with zero and end with nrow
ep <- c(0, ep, nrow(x))
# ...and be unique
ep <- unique(ep)
ds_data <- period.apply(x, INDEX = ep, FUN = mean)
align_data <- align.time(ds_data,xminutes*60) # aligning to x seconds
return(align_data)
})
return(day_list)
}
p <- resample_data_minutely_daywise(data_xts,50)
sapply(p,length)
# [1] 30 30 30 30 30 30 30 30 30 30 30 30 30 30