2016-10-26 3 views
1

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

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 год Каждая минута дает значение мощности. Чтобы выполнять Time Series, мне нужно агрегировать свои данные за 30 минут. Это дало бы мне 17,520 строк в конце. Мои вопросы:

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

  2. Как суммировать значение мощности на 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 
+0

Спасибо Марк! Я попробовал свой метод, сначала установив эти два пакета и преобразовывая дату в числовое, но все же получил эту ошибку: Ошибка в UseMethod («mutate_»): не применимый метод для «mutate_», примененный к объекту класса «функция». Пожалуйста, сообщите. :) – Sunshine

+0

'df' - это функция, если вы не перезаписали ее своими данными. Замените его именем ваших данных –

1

С 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 
+0

Спасибо m0nhawk, но та же ошибка появилась. Пожалуйста, обратитесь к моему ответу на комментарий Марка выше. – Sunshine

+0

Есть ли способ генерировать «приятные» перерывы в верхней части каждого часа, и каждую половину минута часовой отметки, в отличие от перерывов 00:57:00 и 00:27:00, показанных здесь? – spacedSparking

Смежные вопросы