我有包含每月观察值的时间序列数据。我现在想要根据数据序列(例如 15 天的序列)对给定的每月值进行插值(首选线性,立方也可以)。中期目标应该是创建一个数据框,以日期为索引,并为所有每月观测值缺失值。
我们可以从月初开始考虑这些值,例如。 “Sep-16”表示 2016 年 9 月 1 日。因此我们还需要更改日期格式。
head(df)
# date sp1
# 1 Sep-16 2.58868
# 2 Oct-16 0.51014
# 3 Nov-16 -0.81165
# 4 Dec-16 -0.52575
# 5 Jan-17 -0.93884
# 6 Feb-17 -1.95657
我想要做的是获取以下日期序列的 sp1 值:
DateSeq <- seq(as.Date("2016-09-01"), as.Date("2020-07-30"), by=15)
我发现了一个问题here
感谢任何帮助,谢谢。
数据
df <- data.frame(date=c("Sep-16", "Oct-16", "Nov-16", "Dec-16", "Jan-17", "Feb-17",
"Mar-17", "Apr-17", "May-17" , "Jun-17", "Jul-17", "Aug-17", "Sep-17", "Oct-17",
"Nov-17", "Dec-17", "Jan-18", "Feb-18", "Mar-18", "Apr-18", "May-18",
"Jun-18", "Jul-18", "Aug-18", "Sep-18", "Oct-18", "Nov-18", "Dec-18",
"Jan-19", "Feb-19", "Mar-19", "Apr-19", "May-19", "Jun-19", "Jul-19",
"Aug-19", "Sep-19", "Oct-19", "Nov-19", "Dec-19", "Jan-20", "Feb-20",
"Mar-20", "Apr-20" , "May-20", "Jun-20", "Jul-20", "Aug-20"),
sp1=c(2.58868 , 0.51014 , -0.81165, -0.52575, -0.93884, -1.95657,
1.65728, 0.00522, -0.11818, -1.14689, -1.24314, -0.50178,
-1.60286, 0.04624, -0.37180, -0.16875, -0.95811, -0.79433,
-0.64041, -1.27894, -0.75469, -0.89954, -1.51727, -0.03980,
-0.76522, 0.11057, 0.13922, 0.45866, -0.70275, -1.37621, 0.89521,
-1.41637, -0.25305, -1.29723, 1.41120, -0.98463, -0.93980, -1.50555,
-1.37363, -2.33455, -0.73567, 0.30003, 1.38937, 1.56948,
-0.23575, -0.52387, 0.97928, 0.40289))
最佳答案
首先,您需要添加一天,例如每月的第一天到日期并转换as.Date
。然后将 merge
与 seq.Date
ds
上的 expand.grid
和 approx
> 要线性插值的值。我使用 sp2
进行演示,但您可以覆盖 sp1
。最后在 ds
上对数据框进行子集化
。
df$date <- as.Date(paste0(df$date, '-01'), '%b-%y-%d')
ds <- seq.Date(as.Date("2016-09-01"), as.Date("2020-07-30"), by=15)
df <- merge(df, expand.grid(date=ds), all=TRUE)
df$sp2 <- approx(df$sp1, xout=seq_along(df$date))$y
res <- subset(df, date %in% ds)
head(res)
# date sp1 sp2
# 1 2016-09-01 2.58868 2.58868000
# 2 2016-09-16 NA 1.54941000
# 3 2016-10-01 0.51014 0.51014000
# 4 2016-10-16 NA 0.06954333
# 5 2016-10-31 NA -0.37105333
# 7 2016-11-15 NA -0.71635000
tail(res)
# date sp1 sp2
# 132 2020-05-13 NA -0.33179
# 133 2020-05-28 NA -0.42783
# 135 2020-06-12 NA -0.02282
# 136 2020-06-27 NA 0.47823
# 138 2020-07-12 NA 0.78715
# 139 2020-07-27 NA 0.59502
注意,“2020-07-30”
不包含在自 2016 年 9 月 1 日开始的 15 天序列中。
可视化
with(df, plot(date, sp2, type='o', ylim=range(df$sp1, na.rm=TRUE)))
with(df, points(date, sp1, pch=16))
legend('topright', pch=c(16, 1), legend=c('measured', 'interpolated'), horiz=TRUE)
关于r - 时间序列插值: monthly data to certain day frequency data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74555824/