【问题标题】:Interpolation in R: retrieving hourly valuesR中的插值:检索每小时值
【发布时间】:2015-09-16 01:48:48
【问题描述】:

我知道有几个相关的问题,但我似乎在这里的某个地方磕磕绊绊。我尽我所能地关注了这个帖子:Interpolating timeseries,但收到错误消息(见下文):

我的数据集包含每天每四个小时收集一次的样本。我想将这些数据插入每小时值。下面是我更大数据集的一个子样本:

vis <- structure(list(datetime = structure(1:24, .Label = c("2002-05-01-00", 
"2002-05-01-06", "2002-05-01-12", "2002-05-01-18", "2002-05-02-00", 
"2002-05-02-06", "2002-05-02-12", "2002-05-02-18", "2002-05-03-00", 
"2002-05-03-06", "2002-05-03-12", "2002-05-03-18", "2002-05-04-00", 
"2002-05-04-06", "2002-05-04-12", "2002-05-04-18", "2002-05-05-00", 
"2002-05-05-06", "2002-05-05-12", "2002-05-05-18", "2002-05-06-00", 
"2002-05-06-06", "2002-05-06-12", "2002-05-06-18"), class = "factor"), 
    VIStot = c(0L, 128L, 359L, 160L, 1L, 121L, 316L, 162L, 1L, 
    132L, 339L, 163L, 2L, 137L, 364L, 155L, 3L, 122L, 345L, 179L, 
    3L, 125L, 147L, 77L)), .Names = c("datetime", "VIStot"), class = "data.frame", row.names = c(NA, 
-24L))

我插入到每小时分辨率的代码如下:

vis[, c(2)] <- sapply(vis[, c(2)], as.numeric)
library(zoo)
vis$datetime <- as.POSIXct(vis$datetime, format="%Y-%m-%d-%H")
hr <- zoo(vis$VIStot, vis$datetime)

int <- na.spline(hr$VIStot)

这以错误消息结束

$.zoo(hr, VIStot) 中的错误:单变量动物园系列不可能

我没有正确格式化日期时间吗?为什么hr 不能同时读取VIStotdatetime

此外,一旦插值,我想以 .csv 文件格式导出值。

【问题讨论】:

    标签: r interpolation


    【解决方案1】:

    对此有两个想法。首先,函数na.spline 想要在vis$VIStot 中估算NA 值,其中没有。因此,也许您的第一个问题是您没有生成函数可以运行的正确序列。

    其次,如果您正在寻找简单的插值,那么如何:

    ## using your "vis" above
    newdt <- seq.POSIXt(vis$datetime[1], tail(vis$datetime, n=1), by='1 hour')
    data.frame(datetime=newdt, VIStot=approx(vis$datetime, vis$VIStot, newdt)$y)
    ##                datetime    VIStot
    ## 1   2002-05-01 00:00:00   0.00000
    ## 2   2002-05-01 01:00:00  21.33333
    ## 3   2002-05-01 02:00:00  42.66667
    ## 4   2002-05-01 03:00:00  64.00000
    ## 5   2002-05-01 04:00:00  85.33333
    ## 6   2002-05-01 05:00:00 106.66667
    

    我知道这在某种程度上是一种解决方法,但您可以从这里轻松地转换为您的 zoo 对象。

    我让它工作的另一种方式:

    library(zoo)
    vis2 <- merge(vis, data.frame(datetime=newdt), by.x='datetime', all.y=TRUE)
    head(vis2, n=8)
    ##              datetime VIStot
    ## 1 2002-05-01 00:00:00      0
    ## 2 2002-05-01 01:00:00     NA
    ## 3 2002-05-01 02:00:00     NA
    ## 4 2002-05-01 03:00:00     NA
    ## 5 2002-05-01 04:00:00     NA
    ## 6 2002-05-01 05:00:00     NA
    ## 7 2002-05-01 06:00:00    128
    ## 8 2002-05-01 07:00:00     NA
    
    hr2 <- zoo(vis2$VIStot, vis2$datetime)
    head(hr2, n=8)
    ## 2002-05-01 00:00:00 2002-05-01 01:00:00 2002-05-01 02:00:00 
    ##                   0                  NA                  NA 
    ## 2002-05-01 03:00:00 2002-05-01 04:00:00 2002-05-01 05:00:00 
    ##                  NA                  NA                  NA 
    ## 2002-05-01 06:00:00 2002-05-01 07:00:00 
    ##                 128                  NA 
    

    语音:

    head(na.spline(hr2), n=8)
    ## 2002-05-01 00:00:00 2002-05-01 01:00:00 2002-05-01 02:00:00 
    ##            0.000000          -12.533246           -8.229736 
    ## 2002-05-01 03:00:00 2002-05-01 04:00:00 2002-05-01 05:00:00 
    ##           10.442935           41.017177           81.025396 
    ## 2002-05-01 06:00:00 2002-05-01 07:00:00 
    ##          128.000000          179.200449 
    

    无论您需要插值、样条曲线还是其他东西,也许这会让您朝着正确的方向前进。

    【讨论】:

    • 谢谢,我发现这个解决方案非常有用。我想知道,除了插值(通常应用于温度或入射辐射)之外,是否可以将 6 小时值均匀地重新分配为 x6 1 小时值(例如降水)。跨度>
    • 请使用示例数据打开一个新问题。参考这个问题作为起点,并解释同质(均匀?)重新分配的确切含义。
    • 当然,刚刚在此处发布:stackoverflow.com/questions/65753515/…。谢谢!
    【解决方案2】:

    hr 没有列,所以hr$VIStot 是错误的。

    试试这个。我们创建一个小时序列tt,然后根据hr 在这些值处评估样条曲线:

    rng <- range(time(hr))
    tt <- seq(rng[1], rng[2], by = "hour")
    z <- na.spline(hr, xout = tt)
    

    这给出了以下内容:

    > head(z)
    2002-05-01 00:00:00 2002-05-01 01:00:00 2002-05-01 02:00:00 2002-05-01 03:00:00 
               0.000000          -12.533246           -8.229736           10.442935 
    2002-05-01 04:00:00 2002-05-01 05:00:00 
              41.017177           81.025396 
    

    和:

    plot(z, type = "o")
    points(hr, pch = 20, col = "red") # original points made red
    

    【讨论】:

    • 这非常好用,谢谢!但是,当我打印 z 时,日期/时间会丢失。有没有办法保留日期/时间值以及插值的 VIStot 值?
    • 我已将head(z) 的输出添加到答案中。如您所见,日期/时间没有丢失。
    • 谢谢。我的问题是我试图将z 写入 .csv 文件,然后再将其转换为数据帧。我使用以下代码来执行此操作:y &lt;- data.frame( dat=format(index(z),'%Y-%m-%d'), time=format(index(z), '%H:%M:%S'), x=as.numeric(z) )。在那之后,一切看起来都很好。再次感谢您的帮助。
    • 使用write.zoo(z, "myfile.csv", sep = ",", col.names = c("Index", "Data"))
    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 2016-09-27
    • 2018-09-17
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2021-05-09
    • 2014-11-27
    相关资源
    最近更新 更多