1

我目前查看了 imputeTS 和 zoo 包,但它看不到工作当前数据是..

group/timeseries(character)
  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

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

我将提供实际数据的图片以更清楚 在此处输入图像描述

我在这里先向您的帮助表示感谢!

4

2 回答 2

1

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

但是您可以将字符作为输入给 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")

第一行中的“输入”是带有 POSIX.ct 时间戳的向量。第二行中的 origin 和 tz(时区)设置必须根据您的时间戳进行设置。

于 2017-12-02T01:18:19.310 回答
1

na.approx在 zoo 包中可以做到这一点,并且可以在没有循环的情况下使用tapplybase 或 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"]
于 2017-11-30T15:40:23.337 回答