我正在使用月度时间序列数据,这实际上是一个xts对象。我的目标是将每月数据转换为每日数据,以便一个月中的每一天都具有特定月份的值。
例如:
library("xts")
observation_dates <- as.Date(c("01.12.1993", "01.01.1994",
"01.02.1994", "01.03.1994", "01.04.1994", "01.05.1994",
"01.06.1994", "01.07.1994", "01.08.1994", "01.09.1994",
"01.10.1994", "01.11.1994", "01.12.1994"), format = "%d.%m.%Y")
air_data <- zoo(matrix(c(21, 21, 21, 30, 35.5, 36, 38.5,
33, 37, 37, 30, 24, 21), ncol = 1), observation_dates)
colnames(air_data) = "air_temperature"
该系列如上所示。 我希望在1993年12月的所有31天中,它的值为21(空气温度),以便该月的平均值仍为21。同样,我希望在剩下的几个月内继续进行,如图所示。
我尝试使用to.period(x, period="days")
,但没有任何变化。
请有人有任何想法吗? 感谢您的帮助
答案 0 :(得分:0)
根据to.period
的帮助, xts 套餐不适用于您的问题:
无法将系列从较低的周期转换为a 更高的周期性 - 例如每周到每天或每天到5分钟的酒吧, 因为这需要魔法
看来,如果需要插值,approx()
函数可能是最佳解决方案
# emulation of the original monthly dates
observation_dates <- as.Date(c("01.12.1993", "01.01.1994",
"01.02.1994", "01.03.1994", "01.04.1994", "01.05.1994",
"01.06.1994", "01.07.1994", "01.08.1994", "01.09.1994",
"01.10.1994", "01.11.1994", "01.12.1994"), format = "%d.%m.%Y")
t_air <- c(21, 23, 20, 30, 35.5, 36, 38.5, 33, 37, 37, 30, 24, 27)
# target dates
seq_date <- seq(from = as.Date("01.12.1993", format = "%d.%m.%Y"),
to = as.Date("31.12.1994", format = "%d.%m.%Y"), by = 1)
ans <- approx(observation_dates, y = t_air, xout = seq_date)
如果每个月只应使用一个值,我会使用两个数据框来解决您的问题。第一个obs_data
用于将观察数据与日期列保存在一个方便的“年月”中。格式
ym_dates <- format(observation_dates, "%Y-%m")
t_air <- c(21, 23, 20, 30, 35.5, 36, 38.5, 33, 37, 37, 30, 24, 27)
obs_data <- data.frame(observation_dates, ym_dates ,t_air)
第二个res_df
,用于保持每日分辨率的目标日期seq_date
。列air_t
首先填充NA
res_df <- data.frame(seq_date, ym = format(seq_date, "%Y-%m"),
stringsAsFactors = FALSE, air_t = NA)
然后使用来自air_t
的数据,使用年份和月份的对应关系填充obs_data
列作为条件
dates_to_int <- unique(res_df$ym)
for (i in seq(along.with = dates_to_int))
{
res_df[which(res_df$ym %in% dates_to_int[i]), "air_t"] <-
obs_data[which(obs_data$ym_dates %in% dates_to_int[i]), "t_air"]
}
希望,它会有所帮助:)
答案 1 :(得分:0)
非常感谢您的回复。但是我能够解决问题。我使用的方法类似于Ekatef建议的方法。在我的情况下,我创建了包含所有日期的空xts对象,并使用lapply()将空xts中的所有变量转换为数字。 然后我使用以下方法将空xts与月度数据系列合并: 合并(X,Y,填充= na.locf)。在这里,na.locf将月度系列中的最后一次观察结果发送到该月的所有日期,随后是另一个月。