R中的插值:检索每小时值

时间:2015-09-16 01:48:48

标签: r interpolation

我认识到有几个相关的问题,但我似乎在这里的某个地方磕磕绊绊。我尽可能地遵循这个主题: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文件格式导出值。

2 个答案:

答案 0 :(得分: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

screenshot

答案 1 :(得分:1)

对此有两点想法。首先,函数na.spline想要在NA中计算vis$VIStot个值,其中没有值## 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 

Voici:

FragmentManager fManager = getFragmentManager();

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