Интерполировать данные для нерегулярных временных рядов - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь интерполировать это meterValue, полный CSV здесь: 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.Гротендик предложил, и я получил ошибку в 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*

Решение кода R для разницы времени в один час в интерполированных данных, предоставленных @G.Гротендик, как показано ниже.

Привет, @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, почему «as.POSIXct» перед `trunc (as.POSIXct (x, origin =” 1970-01-01 ”)?
Я понимаю, что" trunc«Функция округляет значение datetime.

В строке 2, что означает этот код« FUN = to.hour, aggregate = 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уже серия zoo после read.csv.zoo, почему мы все еще должны использовать «as.zoo» и «as.ts» в строке «na.approx»?

в чем разница между сериями zoo и zooreg?

В строке 4 «время (zz)» является индексом функции «zz»?

Заранее благодарим вас за объяснение.

Я могуld построим интерполированные данные с разницей во времени = 1 часenter image description here

1 Ответ

0 голосов
/ 14 октября 2018

Считайте файл, используя read.csv.zoo, преобразовав в Date класс, объединяющий повторяющиеся даты так, чтобы использовалась последняя.Затем преобразуйте в ts и вернитесь в зоопарк, который заполнит пустые дни NA.Теперь используйте 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 = ".")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...