【问题标题】:Interpolation over time随时间插值
【发布时间】:2016-12-08 11:06:05
【问题描述】:

在一个数据框中,我每天在 00:00、06:00、12:00 和 18:00 点测量四次风速数据。要将这些与其他数据结合起来,我需要将中间的时间填充到 15 分钟的分辨率。我想通过简单的插值来填补空白。

以下示例生成两个对应的示例数据帧。 df1df2 需要合并。在生成的合并数据帧中,6 小时值之间的间隙值(var == NA?)需要通过简单的平均插值来填充。 我的问题是如何合并两者并在给定值之间进行具体插值。

第一个数据帧

创作:

# create a corresponding sample data frame
df1 <- data.frame(
  date = seq.POSIXt(
    from = ISOdatetime(2015,10,1,0,0,0, tz = "GMT"),
    to = ISOdatetime(2015,10,14,23,59,0, tz= "GMT"),
    by = "6 hour"
  ),
  windspeed = abs(rnorm(14*4, 10, 4)) # abs() because windspeed shoud be positive
)

结果数据框:

> # show the head of the dataframe
> head(df1)
                 date windspeed
1 2015-10-01 00:00:00 17.928217
2 2015-10-01 06:00:00 11.306025
3 2015-10-01 12:00:00  6.648131
4 2015-10-01 18:00:00 10.320146
5 2015-10-02 00:00:00  2.138559
6 2015-10-02 06:00:00  9.076344

第二个数据帧

创作:

# create a 2nd corresponding sample data frame
df2 <- data.frame(
  date = seq.POSIXt(
    from = ISOdatetime(2015,10,1,0,0,0, tz = "GMT"),
    to = ISOdatetime(2015,10,14,23,59,0, tz= "GMT"),
    by = "15 min"
  ),
  var = abs(rnorm(14*24*4, 300, 100))
)

结果数据框:

> # show the head of the 2nd dataframe
> head(df2)
                 date      var
1 2015-10-01 00:00:00 198.2657
2 2015-10-01 00:15:00 472.9041
3 2015-10-01 00:30:00 605.8776
4 2015-10-01 00:45:00 429.0949
5 2015-10-01 01:00:00 400.2390
6 2015-10-01 01:15:00 317.1503

【问题讨论】:

  • 请使用set.seed 使您的示例可重现。另外请添加您的预期输出
  • help("merge"); library(zoo); help("na.approx")

标签: r time-series interpolation


【解决方案1】:

这是一个解决方案

首先将它们合并得到使用all = TRUE 得到所有值

df3 <- merge(df1, df2, all = TRUE)

然后使用 approx 进行插值

df3$windspeed <- approx(x = df1$date, y = df1$windspeed, xout = df2$date)$y

唯一的问题是,除非你的最后一个风速值在那里,否则 las 将是 NA,但介于两者之间的一切都会在那里

【讨论】:

  • 谢谢,approx 似乎正是我要找的东西!第二个代码行末尾的$y 代表什么?
  • 欢迎您 @Arne,approx 函数将为您提供一个列表,其中 x 是您在案例日期中完整拥有的值,y 是您要插入的值(Windspeed )。如果你取出 $y,它会给你一个列表,你不能轻易地附加到你的数据中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2017-08-13
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多