r - 时间序列插值: monthly data to certain day frequency data

标签 r datetime merge interpolation linear-interpolation

我有包含每月观察值的时间序列数据。我现在想要根据数据序列(例如 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。然后将 mergeseq.Date ds 上的 expand.gridapprox > 要线性插值的值。我使用 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)

enter image description here

关于r - 时间序列插值: monthly data to certain day frequency data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74555824/

相关文章:

version-control - 没有 merge 的情况下如何 merge Mercurial中的两个分支

javascript - 如何合并 2 个 javascript 对象,如果另一个对象中不存在属性,则填充一个对象中的属性?

merge - CVS合并算法

r - 创建差异列

C++11 获取当前日期和时间作为字符串

r - 第二列中有两个不同值的重复 ID

sql - MS SQL Server 日期 Excel

php - 如何获取尊重用户时区的日期和时间

r - 在 Tidyverse 中过滤事件数据的时间

r - 如何最大限度地利用 R 中的 Tensorflow 2.0(使用 Keras 库)的 GPU 使用率?