Заполните пропущенные даты и время в квартальных временных рядах в соответствии с подгруппой - PullRequest
2 голосов
/ 28 января 2020

У меня есть данные следующего типа, только они намного больше.

DIST TALUK HOBLI CODE DATE      REC_TIME    RAIN
DK  P1  A1  1503    01-06-19    00:00:00    22.5
DK  P1  A1  1503    01-06-19    00:15:00    23.0
DK  P1  A1  1503    01-06-19    00:30:00    23.0
DK  P1  A1  1503    01-06-19    00:45:00    23.0
DK  P1  A1  1503    01-06-19    01:00:00    23.0
DK  P1  A1  1503    01-06-19    01:15:00    23.0
DK  P1  A1  1503    01-06-19    01:30:00    23.0
DK  P1  A1  1503    01-06-19    01:45:00    23.0
DK  P1  A1  1503    01-06-19    02:00:00    23.0
DK  P1  A2  515     01-06-19    22:15:00    23.0
DK  P1  A2  515     01-06-19    22:30:00    23.0
DK  P1  A2  515     01-06-19    22:45:00    23.0
DK  P1  A2  515     01-06-19    23:00:00    23.0
DK  P2  A3  633     01-07-19    22:15:00    23.0
DK  P2  A3  633     01-07-19    22:30:00    24.0
DK  P2  A3  633     01-07-19    22:45:00    24.0
DK  P2  A3  633     01-07-19    23:00:00    24.0
DK  P2  A3  633     01-07-19    23:15:00    24.0
DK  P2  A3  633     01-07-19    23:30:00    29.0
DK  P2  A3  633     01-07-19    23:45:00    32.0
DK  P2  A3  633     02-07-19    00:00:00    36.0
DK  P2  A3  633     02-07-19    00:15:00    36.0
DK  P3  B1  845     01-06-19    05:30:00    36.0
DK  P3  B1  845     01-06-19    05:45:00    36.0
DK  P3  B1  845     01-06-19    06:00:00    36.0
DK  P3  B1  845     01-06-19    06:15:00    36.0
DK  P3  B1  845     01-06-19    06:30:00    36.0
DK  P3  B1  845     01-06-19    06:45:00    36.0
DK  P3  B1  845     01-06-19    07:00:00    36.0
DK  P3  B1  845     01-06-19    07:15:00    36.0
DK  P3  B2  789     01-06-19    07:30:00    36.0
DK  P3  B2  789     01-06-19    07:45:00    36.0
DK  P3  B2  789     01-06-19    08:00:00    36.0
DK  P3  B2  789     01-06-19    08:15:00    36.0
DK  P3  B2  789     01-06-19    08:30:00    36.0
DK  P3  B2  789     01-06-19    08:45:00    0.0
DK  P3  B2  789     01-06-19    09:00:00    0.0
DK  P3  B2  789     01-06-19    09:15:00    0.0
DK  P3  B2  789     01-06-19    09:30:00    0.0
DK  P4  B4  801     22-08-19    00:00:00    0.0
DK  P4  B4  801     22-08-19    00:15:00    0.0
DK  P4  B4  801     22-08-19    00:30:00    0.5
DK  P4  B4  801     22-08-19    00:45:00    0.5
DK  P4  B4  801     22-08-19    22:30:00    0.5
DK  P4  B4  801     22-08-19    22:45:00    0.5
DK  P4  B4  801     30-11-19    21:45:00    0.5
DK  P4  B4  801     30-11-19    22:00:00    0.5
DK  P4  B4  801     30-11-19    22:15:00    0.5
DK  P4  B4  801     30-11-19    22:30:00    2.0
DK  P4  B4  801     30-11-19    22:45:00    5.5
DK  P4  B4  801     30-11-19    23:00:00    5.5
DK  P4  B4  801     30-11-19    23:15:00    5.5
DK  P4  B4  801     30-11-19    23:30:00    5.5
DK  P4  B4  801     30-11-19    23:45:00    5.5

Данные начинаются с 01-06-19 (01-Jun-19) до 30-11-19 (30-Nov-19) и каждый час имеет четыре показания, но для некоторых станций наблюдения за некоторыми днями и временем в этой последовательности отсутствуют. Я хочу заполнить пропущенные ДАТЫ и REC_TIME так, чтобы на каждой станции были наблюдения с 01-06-19 по 30-11-19. Переменная RAIN для таких DATES и REC_TIME должна быть заполнена символом NA.

Я перепробовал несколько вариантов, предложенных людьми при переполнении стека, но не получил желаемого результата. Я также попытался сделать следующее:

df_1 <- df[, .(RECORDED_DATE = seq(as.Date(min(df$RECORDED_DATE)), as.Date(max(df$RECORDED_DATE)), "day")), by = list(DISTRICT, TALUKNAME, HOBLINAME, TRGCODE, HOUR)]   

Это заняло слишком много времени при обработке, и полученный результат был похож на:

DIST TALUK HOBLI CODE DATE      REC_TIME    RAIN
DK  P1  A1  1503    01-06-19    00:00:00    22.5
DK  P1  A1  1503    02-06-19    00:00:00    00.0
DK  P1  A1  1503    03-06-19    00:00:00    01.0
DK  P1  A1  1503    04-06-19    00:00:00    03.0
DK  P1  A1  1503    05-06-19    00:00:00    00.0
DK  P1  A1  1503    06-06-19    00:00:00    15.0
DK  P1  A1  1503    07-06-19    00:00:00    09.0
DK  P1  A1  1503    08-06-19    00:00:00    05.0
DK  P1  A1  1503    09-06-19    00:00:00    13.0

Я также попытался tidyverse, завершено, но не получилось результат, поскольку произошла ошибка во фрейме данных. Данные имеют DATE как CHARACTER и после использования tidyverse или завершения их преобразования в DOUBLE, поэтому слияния не происходит. Я пытался преобразовать CHARACTER в NUMERI C, но в результате столбец DATE был заполнен символами NA. Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Используя dplyr и tidyr, мы можем объединить столбец даты и времени с unite, затем создать последовательность каждые 15 минут из min и max DATETIME и получить дату и время в отдельности столбцы.

library(dplyr)
library(tidyr)

df %>%
  unite(DATETIME, DATE, REC_TIME, sep = " ", remove = FALSE) %>%
  mutate(DATETIME = as.POSIXct(DATETIME, format = "%d-%m-%y %T", tz = "UTC")) %>%
  complete(CODE, DATETIME = seq(min(DATETIME), max(DATETIME), by = "15 min")) %>%
  mutate(DATE = as.Date(DATETIME), REC_TIME = format(DATETIME, "%T")) %>%
  select(-DATETIME) %>%
  group_by(CODE) %>%
  fill(DIST, TALUK, HOBLI, .direction = "updown")

данные

df <- structure(list(DIST = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "DK", class = "factor"), 
TALUK = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("P1", 
"P2", "P3", "P4"), class = "factor"), HOBLI = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("A1", "A2", "A3", 
"B1", "B2", "B4"), class = "factor"), CODE = c(1503L, 1503L, 
1503L, 1503L, 1503L, 1503L, 1503L, 1503L, 1503L, 515L, 515L, 
515L, 515L, 633L, 633L, 633L, 633L, 633L, 633L, 633L, 633L, 
633L, 845L, 845L, 845L, 845L, 845L, 845L, 845L, 845L, 789L, 
789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 801L, 801L, 
801L, 801L, 801L, 801L, 801L, 801L, 801L, 801L, 801L, 801L, 
801L, 801L, 801L), DATE = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L), .Label = c("01-06-19", "01-07-19", "02-07-19", 
"22-08-19", "30-11-19"), class = "factor"), REC_TIME = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 29L, 30L, 31L, 32L, 29L, 
30L, 31L, 32L, 33L, 34L, 35L, 1L, 2L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
26L, 1L, 2L, 3L, 4L, 30L, 31L, 27L, 28L, 29L, 30L, 31L, 32L, 
33L, 34L, 35L), .Label = c("00:00:00", "00:15:00", "00:30:00", 
"00:45:00", "01:00:00", "01:15:00", "01:30:00", "01:45:00", 
"02:00:00", "05:30:00", "05:45:00", "06:00:00", "06:15:00", 
"06:30:00", "06:45:00", "07:00:00", "07:15:00", "07:30:00", 
"07:45:00", "08:00:00", "08:15:00", "08:30:00", "08:45:00", 
"09:00:00", "09:15:00", "09:30:00", "21:45:00", "22:00:00", 
"22:15:00", "22:30:00", "22:45:00", "23:00:00", "23:15:00", 
"23:30:00", "23:45:00"), class = "factor"), RAIN = c(22.5, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 
24, 24, 29, 32, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 
36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 
0.5, 0.5, 2, 5.5, 5.5, 5.5, 5.5, 5.5)), class = "data.frame", row.names = c(NA, -54L))
1 голос
/ 29 января 2020

Если ваш набор данных большой, это может быть более быстрый вариант с использованием data.table:

ans <- DT[CJ(CODE, dt=seq(min(dt), max(dt), by="15 mins"), unique=TRUE), 
    on=.(CODE, dt), roll="nearest"]

ans[DateTime!=dt, `:=` (
    .(DATE=format(dt, format="%d-%m-%y"), 
        REC_TIME=format(dt, format="%H:%M:%S"), 
        RAIN=NA_real_)
    )][,
        DateTime := NULL]

data:

library(data.table)
DT <- fread("DIST TALUK HOBLI CODE DATE      REC_TIME    RAIN
DK  P1  A1  1503    01-06-19    00:00:00    22.5
DK  P1  A1  1503    01-06-19    00:15:00    23.0
DK  P1  A1  1503    01-06-19    00:30:00    23.0
DK  P1  A1  1503    01-06-19    00:45:00    23.0
DK  P1  A1  1503    01-06-19    01:00:00    23.0
DK  P1  A1  1503    01-06-19    01:15:00    23.0
DK  P1  A1  1503    01-06-19    01:30:00    23.0
DK  P1  A1  1503    01-06-19    01:45:00    23.0
DK  P1  A1  1503    01-06-19    02:00:00    23.0
DK  P1  A2  515     01-06-19    22:15:00    23.0
DK  P1  A2  515     01-06-19    22:30:00    23.0
DK  P1  A2  515     01-06-19    22:45:00    23.0
DK  P1  A2  515     01-06-19    23:00:00    23.0
DK  P2  A3  633     01-07-19    22:15:00    23.0
DK  P2  A3  633     01-07-19    22:30:00    24.0
DK  P2  A3  633     01-07-19    22:45:00    24.0
DK  P2  A3  633     01-07-19    23:00:00    24.0
DK  P2  A3  633     01-07-19    23:15:00    24.0
DK  P2  A3  633     01-07-19    23:30:00    29.0
DK  P2  A3  633     01-07-19    23:45:00    32.0
DK  P2  A3  633     02-07-19    00:00:00    36.0
DK  P2  A3  633     02-07-19    00:15:00    36.0
DK  P3  B1  845     01-06-19    05:30:00    36.0
DK  P3  B1  845     01-06-19    05:45:00    36.0
DK  P3  B1  845     01-06-19    06:00:00    36.0
DK  P3  B1  845     01-06-19    06:15:00    36.0
DK  P3  B1  845     01-06-19    06:30:00    36.0
DK  P3  B1  845     01-06-19    06:45:00    36.0
DK  P3  B1  845     01-06-19    07:00:00    36.0
DK  P3  B1  845     01-06-19    07:15:00    36.0
DK  P3  B2  789     01-06-19    07:30:00    36.0
DK  P3  B2  789     01-06-19    07:45:00    36.0
DK  P3  B2  789     01-06-19    08:00:00    36.0
DK  P3  B2  789     01-06-19    08:15:00    36.0
DK  P3  B2  789     01-06-19    08:30:00    36.0
DK  P3  B2  789     01-06-19    08:45:00    0.0
DK  P3  B2  789     01-06-19    09:00:00    0.0
DK  P3  B2  789     01-06-19    09:15:00    0.0
DK  P3  B2  789     01-06-19    09:30:00    0.0
DK  P4  B4  801     22-08-19    00:00:00    0.0
DK  P4  B4  801     22-08-19    00:15:00    0.0
DK  P4  B4  801     22-08-19    00:30:00    0.5
DK  P4  B4  801     22-08-19    00:45:00    0.5
DK  P4  B4  801     22-08-19    22:30:00    0.5
DK  P4  B4  801     22-08-19    22:45:00    0.5
DK  P4  B4  801     30-11-19    21:45:00    0.5
DK  P4  B4  801     30-11-19    22:00:00    0.5
DK  P4  B4  801     30-11-19    22:15:00    0.5
DK  P4  B4  801     30-11-19    22:30:00    2.0
DK  P4  B4  801     30-11-19    22:45:00    5.5
DK  P4  B4  801     30-11-19    23:00:00    5.5
DK  P4  B4  801     30-11-19    23:15:00    5.5
DK  P4  B4  801     30-11-19    23:30:00    5.5
DK  P4  B4  801     30-11-19    23:45:00    5.5")
DT[, dt := as.POSIXct(paste0(DATE, REC_TIME), format="%d-%m-%y %H:%M:%S")][,
    DateTime := dt]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...