如何在时间序列中插入缺失值,受连续 NA (R) 的数量限制?

How to interpolate missing values in a time series, limited by the number of sequential NAs (R)?

我在日期时间序列中缺少值。例如:

set.seed(101)

df <- data.frame(DATE = as.Date(c('2012-01-01', '2012-01-02', 
'2012-01-03', '2012-01-05', '2012-01-06', '2012-01-15', '2012-01-18', 
'2012-01-19', '2012-01-20', '2012-01-22')),
                 VALUE = rnorm(10, mean = 5, sd = 2))

我如何编写一个函数来填充第一个日期和最后一个日期(即 2012-01-01 和 2012-01-22')之间的所有缺失日期,然后使用插值(线性和平滑样条)来填充缺失值,但不超过 3 个连续缺失值(即 2012-01-06 和 2012-01-15 之间没有插值)?

该函数将应用于非常大的数据框。我已经能够编写一个函数,它使用线性插值来填充两个日期之间的所有缺失值(见下文),但我无法弄清楚如何阻止它插值很长一段时间的缺失值。

interpolate.V <- function(df){

  # sort data by time 
  df <- df[order(df$DATE),]

  # linnearly interpolate VALUE for all missing DATEs
  temp <- with(df, data.frame(approx(DATE, VALUE, xout = seq(DATE[1], 
               DATE[nrow(df)], "day"))))
  colnames(temp) <- c("DATE", "VALUE_INTERPOLATED")
  temp$ST_ID <- df$ST_ID[1]
  out <- merge(df, temp, all = T)
  rm(temp)

  return(out)
}

任何帮助将不胜感激!

谢谢

为所有缺失日期添加行的函数:

date.range <- function(sub){

  sub$DATE <- as.Date(sub$DATE)
  DATE <- seq.Date(min(sub$DATE), max(sub$DATE), by="day")
  all.dates <- data.frame(DATE)
  out <- merge(all.dates, sub, all = T)

  return(out)
}

使用带有 maxgap 参数的 zoo 包中的 na.approx 或 na.spline:

interpolate.zoo <- function(df){
  df$VALUE_INT <- na.approx(df$VALUE, maxgap = 3, na.rm = F)
  return(df)
}