Как заменить отсутствующее значение в данных временного ряда с помощью цикла? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь создать цикл для замены отсутствующих данных временного ряда на value == 0.

Это мои данные:

df
Times                   value
05-03-2018 09:00:00      1
05-03-2018 09:01:26      2
05-03-2018 09:04:28      1
05-03-2018 09:07:05      2
05-03-2018 09:09:05      1

и мой желаемый результат:

Times                   value
05-03-2018 09:00:00      1
05-03-2018 09:01:26      2
05-03-2018 09:02:00      0
05-03-2018 09:03:00      0
05-03-2018 09:04:28      1
05-03-2018 09:05:00      0
05-03-2018 09:06:00      0
05-03-2018 09:07:05      2
05-03-2018 09:08:00      0
05-03-2018 09:09:05      1

Недостающие минуты в данных должны быть созданы и им присвоено значение 0.

Что мне делать? Создать новую таблицу манекенов с отсутствующей минутой или сделать цикл зацикливания?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Вы можете сделать это с помощью пакетов dplyr и padr. padr очень полезен для расширения ряда дата-время между датами или добавления пропущенных значений.

library(dplyr)
library(padr)

df1 %>% 
  thicken(interval = "min") %>% # roll time series up to minutes
  pad(by = "Times_min") %>% # add missing minute intervals
  fill_by_value(value) %>% # fill missing values with 0
  mutate(Times = if_else(is.na(Times), Times_min, Times)) %>% # fill NA's in Times column
  select(-Times_min) # drop not needed column

pad applied on the interval: min
                 Times value
1  2018-03-05 09:00:00     1
2  2018-03-05 09:01:26     2
3  2018-03-05 09:02:00     0
4  2018-03-05 09:03:00     0
5  2018-03-05 09:04:28     1
6  2018-03-05 09:05:00     0
7  2018-03-05 09:06:00     0
8  2018-03-05 09:07:05     2
9  2018-03-05 09:08:00     0
10 2018-03-05 09:09:05     1

данные:

df1 <- structure(list(Times = structure(c(1520240400, 1520240486, 1520240668, 
1520240825, 1520240945), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    value = c(1, 2, 1, 2, 1)), row.names = c(NA, -5L), class = "data.frame")
0 голосов
/ 10 ноября 2018

Вы можете создать второй «полный» фрейм данных и объединить их вместе.

dif <- diff(as.numeric(range(df1$Times)))
df1 <- merge(df1, 
             data.frame(Times=as.POSIXct(0:(dif/60)*60, 
                                         origin=df1[1, 1], tz="UTC")), all=TRUE)

Затем замените полученные NA s на 0.

df1[is.na(df1$value), 2] <- 0

Окончательно удалите дубликаты.

df1 <- df1[-which(duplicated(strftime(df1$Times, format="%M"))) + 1, ]

Урожайность:

> df1
                 Times value
1  2018-03-05 09:00:00     1
3  2018-03-05 09:01:26     2
4  2018-03-05 09:02:00     0
5  2018-03-05 09:03:00     0
7  2018-03-05 09:04:28     1
8  2018-03-05 09:05:00     0
9  2018-03-05 09:06:00     0
11 2018-03-05 09:07:05     2
12 2018-03-05 09:08:00     0
14 2018-03-05 09:09:05     1

Данные:

df1 <- structure(list(Times = structure(c(1520240400, 1520240486, 1520240668, 
1520240825, 1520240945), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    value = c(1, 2, 1, 2, 1)), row.names = c(NA, -5L), class = "data.frame")
0 голосов
/ 10 ноября 2018
library(tidyverse)
library(lubridate)
library(magrittr)

Восстановите ваши данные

df <- tibble(
  Times = c("05-03-2018 09:00:00", "05-03-2018 09:01:26",
            "05-03-2018 09:04:28", "05-03-2018 09:07:05",
            "05-03-2018 09:09:05"),
  value = c(1, 2, 1, 2, 1)
)

код

Разобрать вашу Times переменную в datetime

df$Times %<>% parse_datetime("%d-%m-%Y %H:%M:%S")

Создать новую переменную join, которая усекается до минуты

df %<>% mutate(join = floor_date(Times, unit = "minute"))

Создайте новый фрейм данных с одной переменной, также называемой join и содержащей каждую минуту в вашем диапазоне

all <- tibble(
  join = seq(as_datetime(first(df$Times), as_datetime(last(df$Times)), by = 60)
)

Объединить оба фрейма данных

result <- left_join(all, df)

Добавьте «пропущенные минуты» в переменную Times

result$Times[is.na(result$Times)] <- result$join[is.na(result$Times)]

Заменить NA на 0

result$value[is.na(result$value)] <- 0

Удалите переменную join

result %>%
  select(- join)

Результат

# A tibble: 10 x 2
   Times               value
   <dttm>              <dbl>
 1 2018-03-05 09:00:00     1
 2 2018-03-05 09:01:26     2
 3 2018-03-05 09:02:00     0
 4 2018-03-05 09:03:00     0
 5 2018-03-05 09:04:28     1
 6 2018-03-05 09:05:00     0
 7 2018-03-05 09:06:00     0
 8 2018-03-05 09:07:05     2
 9 2018-03-05 09:08:00     0
10 2018-03-05 09:09:05     1
...