R - Dplyr группировка с переходом на летнее время - PullRequest
0 голосов
/ 02 мая 2020

У меня есть DataFrame f с данными с шагом 10 минут, например:

DateTime           id     value             name
2015-01-01 00:00:00 40497   0                  HY
2015-01-01 00:00:00 51395   589                HY
2015-01-01 00:10:00 51395   583                HY
2015-01-01 00:10:00 40497   0                  HY
2015-01-01 00:20:00 51395   586                HY
2015-01-01 00:20:00 40497   0                  HY
2015-01-01 00:30:00 40497   0                  HY
2015-01-01 00:30:00 51395   586                HY
2015-01-01 00:40:00 40497   0                  HY

Идентификатор и имя столбца не имеют отношения к тому, что я хочу сделать. Тип DataFrame выглядит следующим образом:

'data.frame':   9510 obs. of  4 variables:
 $ DateTime        : POSIXct, format: "2019-10-27 00:00:00" "2019-10-27 00:10:00" "2019-10-27 00:20:00" ...
 $ id        : int  40497 40497 40497 40497 40497 40497 40497 40497 40497 40497 ...
 $ value        : int  1445 1444 1433 1431 1430 1431 1427 1411 1411 1410 ...
 $ name: chr  "HY" "HY" "HY" "HY" ...

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

  f <- f %>%
    mutate(Year = year(DateTime)) %>%
    filter(Year == 2019) %>%
    mutate(day = floor_date(DateTime, 'day'), h = hour(DateTime)) %>%
    group_by(day, h) %>%
    mutate(sum_col = sum(value)) %>%
    distinct(Year, .keep_all = T) %>%
    ungroup()

Проблема заключается в том, что мне нужно учитывать переход на летнее время, а точнее 27/10/2019 02:00:00. В моих данных DataFrame мне нужно иметь две строки для этого значения, одна из которых является обычной, а другая - для перехода на летнее время. Данные уже имеют "двойные значения" для каждой из 10 минут между 02:00 и 03:00 ", и это выглядит так, но, конечно, с несколькими идентификаторами:

DateTime           id     value     name
2019-10-27 02:00:00 40497   1403    HY
2019-10-27 02:10:00 40497   1396    HY
2019-10-27 02:20:00 40497   1395    HY
2019-10-27 02:30:00 40497   1396    HY
2019-10-27 02:40:00 40497   1380    HY
2019-10-27 02:50:00 40497   1374    HY
2019-10-27 02:00:00 40497   1373    HY
2019-10-27 02:10:00 40497   1374    HY
2019-10-27 02:20:00 40497   1373    HY
2019-10-27 02:30:00 40497   1373    HY
2019-10-27 02:40:00 40497   1373    HY
2019-10-27 02:50:00 40497   1373    HY
2019-10-27 03:00:00 40497   1367    HY

Мой вопрос: как мог Я группирую по часам, независимо от имени и идентификатора, и суммирую столбец значений и получаю 2 строки 2019-10-27 02:00:00, первая для «реальной», а другая для перехода на летнее время.

...