使用 R 中的 xts 和 zoo 包对时间序列进行重采样

Resampling time series with xts and zoo packages in R

我正在尝试使用给定的 5 分钟时间分辨率 (source) 对数据集进行重新采样。为了获得 30 分钟的重采样时间分辨率,我尝试了:

#Date and Time together
SRI_2010$Date_Time = paste(SRI_2010$Date, SRI_2010$Time, sep=" ")
SRI_2010$Date_Time=as.character(SRI_2010$Date_Time)
SRI_2010$Date_Time=as.POSIXct(SRI_2010$Date_Time,format="%d/%m/%Y %H:%M")

#Creating the zoo object
SRI_2010.zoo <- zoo(SRI_2010,as.POSIXct(SRI_2010$Date_Time))

#Criteria for the resampling
ends2010 <- endpoints(SRI_2010.zoo,'minutes', 30)
SRI_30m_2010 <-period.apply(SRI_2010.zoo$SRI..W.m2.,ends2010,mean)

一开始,我很满意,因为代码成功了,但经过仔细检查,我意识到它计算的是第 25 分钟和第 55 分钟的平均值,而不是第 00 分钟和第 30 分钟的平均值我有兴趣。

示例:

> SRI_30m_2010
2010-07-28 04:55:00 2010-07-28 05:25:00 
         3.80000000         12.06666667 
2010-07-28 05:55:00 2010-07-28 06:25:00 
        19.73333333         28.46666667 
2010-07-28 06:55:00 2010-07-28 07:25:00 
        40.30000000         61.60000000

当我打算将具有不同时间分辨率的不同数据集组合成一个公共数据集时,这个小问题非常烦人。有谁知道我该如何解决这个问题?

"issue" 是 endpoints 正在做它设计的事情。它返回每个时期的最后一个时间戳。我建议您使用 align.time 将索引时间戳向前移动到您感兴趣的分钟。

s <- align.time(as.xts(SRI_30m_2010), 60*30)

如果您尝试将具有不同分辨率的多个系列合并到一个 xts 对象中,这也不是什么大问题。您可以将它们全部合并,使用 na.locf 或类似的方法来填充缺失值,然后提取您感兴趣的分辨率。我相信 xts FAQ 向您展示了如何执行此操作,我知道我已经证明了在我关于 Whosebug 的其他回答中不止一次。