r中列中缺失值的时间序列的插值

时间:2017-11-30 13:43:04

标签: r time-series interpolation zoo imputets

我目前看过imputeTS和动物园包,但它看起来不起作用 目前的数据是......

    string componentName = Assembly.GetExecutingAssembly().CodeBase;
    UriBuilder oUriBuilder = new UriBuilder(componentName);
    string strPath = oUriBuilder.UnescapeDataString(oUriBuilder.Path);
    string strDirectory =  Path.GetDirectoryName(strPath);

我想用插值时间序列填充NA,以便时间是前后行的中点。另外,我必须指出每个时间序列属于一个组。意味着时间重置每个组。

我将提供更清晰的实际数据图片 enter image description here

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

zoo包中的

na.approx可以执行此操作,并且可以使用base中的tapply或data.table中的组操作来无需循环地处理分组。

对于您的数据集

df <- read.table(text=c("
  group   timeseries
  1   '2017-05-17 04:00:00'
  1   '2017-05-17 04:01:00'
  1   NA
  1   NA
  1   '2017-05-17 05:00:00'
  1   '2017-05-17 06:00:00'
  2   NA
  2   '2017-05-17 04:31:00'
  2   NA
  2   NA
  2   NA
  2   '2017-05-17 05:31:00'
"), 
colClasses = c("integer", "POSIXct"),
header = TRUE)

编写函数以将向量强制转换为动物园对象,插入NA,提取结果

library(zoo)
foo <- function(x) coredata(na.approx(zoo(x), na.rm = FALSE))

在基础R中使用tapply将foo应用于每个组的示例

df2 <- df #make a copy
df2$timeseries <- do.call(c, tapply(df2$timeseries, INDEX = df2$group, foo))

在data.table中使用group by将foo应用于每个组的示例

library(data.table)
DT <- data.table(df)
DT[, timeseries := foo(timeseries), by = "group"]

答案 1 :(得分:1)

imputeTS和zoo不会将字符或时间戳作为插值函数的输入。 (通常插值字符没有意义)

但是您可以将字符作为动物园的na.locf函数的输入。 (最后一次观察是用这个函数继续进行的)

您的任务的最佳解决方案应如下所示 (我假设您将日期指定为POSIX.ct)

# Perform the imputation on numeric input
temp <- imputeTS::na.interpolation( as.numeric ( input ) )

# Transform the numeric values back to dates
as.POSIXct(temp, origin = "1960-01-01", tz = "UTC")

使用&#34;输入&#34;在第一行是带有POSIX.ct时间戳的向量。 必须根据时间戳设置第二行中的原点和tz(时区)设置。