eConti - программирование в вопросах и ответах

Как агрегировать каждые 30 минут в R

Я застрял в R. Мне нужно собирать данные каждую минуту каждые 30 минут. Мой фрейм данных выглядит так:

    Date        Time       Power
    2008-10-11  23:57:00   0.376
    2008-10-11  23:58:00   0.374
    2008-10-11  23:59:00   0.374
    2008-10-12  0:00:00    0.334
    2008-10-12  0:01:00    0.330
...
    2008-12-13  19:24:00   1.390
    2008-12-13  19:25:00   1.370
    2008-12-13  19:26:00   1.368
    2008-12-13  19:27:00   1.362
    2008-12-13  19:28:00   1.352
    2008-12-13  19:29:00   1.360

...

По сути, у меня есть 500 979 строк данных за 2008 год. Каждая минута дает значение мощности. Чтобы сделать временные ряды, мне нужно агрегировать данные за 30 минут. В итоге это дало бы мне около 17 520 строк. Мои вопросы:

  1. Можно ли построить временные ряды, если у вас есть пропущенные значения для столбца Power?

  2. Как агрегировать значение Power на 30 минут, пожалуйста? (например, с 0:00:00 до 0:29:00; с 0:30:00 до 0:59:00)

Большое спасибо!


Ответы:


1

С помощью magrittr и dplyr вы можете создать новый столбец для хранения переменной группировки, указывающей единицу измерения времени, в которой находится измерение, а затем summarise для расчета любой совокупной метрики, которую вы хотите. (Примечание %<>% сохраняет результаты каналов обратно в исходную переменную).

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

df %<>%
  mutate(cleanTime =
           strsplit(Time, ":") %>%
           sapply(function(x){
             x <- as.numeric(x)
             x[1] + x[2]/60 + x[3]/(60*60)
           })
         , roundTime = floor(cleanTime * 2)/2
         )

Затем сгруппируйте по сгенерированной переменной и возьмите любую совокупную статистику, которую вы хотите:

df %>%
  group_by(Date, roundTime) %>%
  summarise(avgPower = mean(Power)
            , sumPower = sum(Power))

дает:

        Date roundTime  avgPower sumPower
      <date>     <dbl>     <dbl>    <dbl>
1 2008-10-11      23.5 0.3746667    1.124
2 2008-10-12       0.0 0.3320000    0.664
3 2008-12-13      19.0 1.3670000    8.202
26.10.2016
  • Спасибо, Марк! Я попробовал ваш метод, сначала установив эти два пакета и преобразовав Date в числовое, но все равно получил эту ошибку: Ошибка в UseMethod (mutate_): нет применимого метода для 'mutate_', примененного к объекту функции класса Пожалуйста, сообщите. :) 28.10.2016
  • df — это функция, если вы не перезаписали ее своими данными. Замените его на имя ваших данных 28.10.2016

  • 2

    С помощью dplyr вы можете сделать следующее (вы можете изменить mean на свою функцию агрегации):

    df %>%
      mutate(DateTime = as.POSIXct(paste(Date, Time))) %>%
      group_by(DateTime = cut(DateTime, breaks="30 min")) %>%
      summarize(Power = mean(Power))
    

    Приведет к следующему результату:

                 DateTime  Power
                   <fctr>  <dbl>
    1 2008-10-11 23:57:00 0.3576
    2 2008-12-13 18:57:00 1.3760
    3 2008-12-13 19:27:00 1.3580
    
    26.10.2016
  • Спасибо, m0nhawk, но появилась та же ошибка. Пожалуйста, обратитесь к моему ответу на комментарий Марка выше. 28.10.2016
  • Есть ли способ создавать хорошие перерывы в начале каждого часа и каждые полминуты часовой отметки, в отличие от перерывов 00:57:00 и 00:27:00, показанных здесь? 08.07.2017
  • Новые материалы

    ИИ для общего блага, часть вторая
    В нашем последнем блоге мы исследовали возможности ИИ для общего блага, указав на несколько инициатив по поиску действенных решений для продвижения справедливых и беспристрастных систем ИИ. По..

    Время расцвета закончилось
    Большую часть своей карьеры в индустрии программного обеспечения программисты работали с головой в песок. Успех в отрасли требует навыков презентации и обучения других. Ценность улучшенных..

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

    Состояние совместной фильтрации в 2022 году, часть 1
    ResBeMF: Улучшение прогнозируемого охвата совместной фильтрации на основе классификации (arXiv) Автор: Анхель Гонсалес-Прието , Авраам Гутьеррес , Фернандо Ортега , Рауль Лара-Кабрера..

    Зачем изучать PYTHON в 2022 году !
    Python — востребованный, доступный язык программирования с активным, постоянно растущим сообществом пользователей. Для тех, кто хочет сменить профессию в мире технологий с помощью..

    Решение капч с помощью Puppeteer
    Это руководство предназначено для текстовых кодов, а не для reCAPTCHA Google (см. конец этого сообщения). Требования: Антикапча или любой другой сервис по разгадыванию капчи. Модуль..

    7 встроенных библиотек Python, которые необходимо знать
    7 встроенных библиотек Python, которые необходимо знать Стандартная библиотека Python значительно упрощает жизнь программистов, предоставляя широкий набор функций. Мы выбираем несколько..