插值不规则时间序列的数据

时间:2018-10-13 18:21:41

标签: r time-series forecasting

我尝试在此处插入完整的csv的meterValue,https://drive.google.com/open?id=18cwtw-chAB-FqqCesXZJ-6NB6eHFJlgQ

localminute,dataid,meter_value
2015-10-03 09:51:53,6578,157806
2015-10-13 13:41:49,6578,158086
:
:
2016-01-17 16:00:33,6578,164544  #end of meter_value data for ID=6578

基于@G。建议使用Grothendieck,在z.interpolate(合并数据)时出现错误

D6578z <- read.csv.zoo("test_6578.csv")[,2]
D6578zd <- to.daily(D6578z)[,4]
#Warning messages:
                #1: In zoo(xx, order.by = index(x), ...) : some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique
                #2: In zoo(rval, index(x)[i]) :some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique

     test_6578t <- time(D6578zd)

     plot(D6578zd,type="p",xaxt="n", pch=19, col="blue",cex=1.5)

     diff(test_6578t) 

     t.daily6578 <- seq(from =min(test_6578t),to=max(test_6578t),by="1 day")

     dummy6578 <- zoo(,t.daily6578) 

     z.interpolated <- merge(D6578zd,dummy6578,all=TRUE)
        *#Error in merge.zoo(D6578zd, dummy6578, all = TRUE) :  series cannot be merged with non-unique index entries in a series*

在@G提供的插值数据中,R代码的解决方案需要一个小时的时差。格洛腾迪克,如下。

嗨@G。 Grothendieck,感谢您提供解决方案代码。关于您的代码,我有一些问题需要与您澄清。

  `line1: to.hour <- function(x) as.POSIXct(trunc(as.POSIXct(x, origin = "1970-01-01"), "hour"))

    line2: z <- read.csv.zoo("test_6578.csv", FUN = to.hour, aggregate = function(x) tail(x, 1))`

         `line3: zz <- na.approx(as.zoo(as.ts(z)))`

        `line4: time(zz) <- as.POSIXct(time(zz), origin = "1970-01-01")`
  

在第1行中,为什么在`trunc(as.POSIXct(x,origin   =“ 1970-01-01”)?
  我知道“ trunc”函数会舍入datetime值。

     

在第2行中,此代码是什么意思“ FUN = to.hour,总计   = function(x)tail(x,1)”起作用?

     

因为我不明白什么是tail(x,1)。我提取了z   CSV文件中的功能,我观察到只有dataid和meter_value   使用“ read.csv.zoo”功能时会生成列。

     

在第3行中,我了解到zz函数可提供插值数据   但是我不完全理解代码“ na.approx(as.zoo(as.ts(z)))”,   由于z已经是read.csv.zoo之后的动物园系列,所以为什么我们仍然有   在“ na.approx”行中使用“ as.zoo”和“ as.ts”?

     

Zooreg和Zooreg系列有什么区别?

     

在第4行中,“ time(zz)”是“ zz”函数的索引吗?

预先感谢您的解释。

我可以绘制时差= 1小时的插值数据。 enter image description here

1 个答案:

答案 0 :(得分:0)

使用read.csv.zoo转换为Date类(汇总重复的日期,以便使用最后一个日期)来读取文件。然后转换为ts并返回到Zoo,它将用空域填充空天。现在使用na.approx填写NA值。由于ts无法表示Date类,因此所得的序列将具有表示日期的数字,因此请将其转换回去。

library(zoo)
z <- read.csv.zoo("test_6578.csv", FUN = as.Date, aggregate = function(x) tail(x, 1))
zz <- na.approx(as.zoo(as.ts(z)))
time(zz) <- as.Date(time(zz))

在评论中,有人声称出口处有孔,但事实并非如此。连续时间之间的差异等于1,并且没有NA。

table(diff(time(zz)))
##   1 
## 106 

any(is.na(zz)) 
## [1] FALSE

any(is.na(time(zz)))
## [1] FALSE

这里有一个例子,说明了一个小时而不是一天的差异。

to.hour <- function(x) as.POSIXct(trunc(as.POSIXct(x, origin = "1970-01-01"), "hour"))
z <- read.csv.zoo("test_6578.csv", FUN = to.hour, aggregate = function(x) tail(x, 1))
zz <- na.approx(as.zoo(as.ts(z)))
time(zz) <- as.POSIXct(time(zz), origin = "1970-01-01")

plot(zz[, 2], type = "p", pch = ".")
相关问题