2014-01-08 4 views
1

Я понимаю, что есть похожие вопросы, однако я не могу найти правильный ответ для моего запроса. У меня есть набор данных, где я хочу усреднить данные в одном столбце с 5-минутными интервалами на основе моей отметки времени, причем усреднение начинается в начале часа, например, среднее значение в 10:00 в течение предшествующих 5 минут, что будет 09: 56-10: 00.Усреднение по временным интервалам для предшествующего 5-минутного бина из даты и времени

Вот пример моего набора данных:

data <- structure(list(datetime = c("11/07/2013 19:20", "11/07/2013 19:21", 
"11/07/2013 19:22", "11/07/2013 19:23", "11/07/2013 19:24", "11/07/2013 19:25", 
"11/07/2013 19:26", "11/07/2013 19:27", "11/07/2013 19:28", "11/07/2013 19:29", 
"11/07/2013 19:30", "11/07/2013 19:31", "11/07/2013 19:32", "11/07/2013 19:33", 
"11/07/2013 19:34", "11/07/2013 19:35", "11/07/2013 19:36", "11/07/2013 19:37", 
"11/07/2013 19:38", "11/07/2013 19:39", "11/07/2013 19:40", "11/07/2013 19:41", 
"11/07/2013 19:42", "11/07/2013 19:43", "11/07/2013 19:44", "11/07/2013 19:45" 
), met = c(-24.24081371, -24.4280008, -24.35142264, -24.84884114, 
-25.06214408, -25.46749039, -25.44670288, -25.86062294, -26.30899817, 
-26.57565791, -26.6866101, -27.03829228, -27.34621325, -27.91269122, 
-28.60861612, -29.16745075, -28.81285096, -29.89737508, -30.26500716, 
-30.08502411, -31.05084494, -31.21356991, -31.05715444, -32.29645243, 
-32.76946492, -32.69307397)), .Names = c("datetime", "met"), 
class = "data.frame", row.names = c(NA, -26L)) 

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

> data$datetime <- as.POSIXct(data$datetime, format="%m/%d/%Y %H:%M") 
> groups <- cut(data$datetime, breaks="5 min") 
> by(data$met, groups, mean) 
groups: 2013-07-11 19:20:00 
[1] -24.58624 
------------------------------------------------------------------------ 
groups: 2013-07-11 19:25:00 
[1] -25.93189 
------------------------------------------------------------------------ 
groups: 2013-07-11 19:30:00 
[1] -27.51848 
------------------------------------------------------------------------ 
groups: 2013-07-11 19:35:00 
[1] -29.64554 
------------------------------------------------------------------------ 
groups: 2013-07-11 19:40:00 
[1] -31.6775 
------------------------------------------------------------------------ 
groups: 2013-07-11 19:45:00 
[1] -32.69307 

Эти правильные средние, но метка времени в первый раз штамп 5-минутного периода времени, а не последним, поэтому 12:01 дается R на самом деле 12:05 (период от 12:01 - 12:05). К сожалению, я не могу получить вывод в формате, например 12/07/2013 12:05 -19.91691.

+0

Итак 'data $ datetime <- as.POSIXct (данные $ datetime, format ="% m /% d /% Y% H:% M "); (группы <- cut (данные $ datetime, breaks = "5 min")) 'не совсем то, что вы искали, не так ли? – lukeA

+0

Спасибо за ваш комментарий, я уже использовал 'data $ datetime <- as.POSIXct (данные $ datetime, format ="% m /% d /% Y% H:% M ")' и '(группы <- cut (data $ datetime, breaks = "5 min") 'и' met.5min <- by (данные $ met.day.night, groups, mean) ', однако он не находится на правильном интервале и находится в кадре данных, который Я не знаю, как экспортировать (извините мое невежество!) – squishy

+0

Просьба представить ожидаемый результат. Неясно, хотите ли вы 5-минутное среднее значение в каждой точке ваших данных или если вы хотите объединить, так что у вас есть только одно наблюдение каждые 5 минут –

ответ

1

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

  • использование split разделить data$met на последней/первой минуты каждого часа (индексы этих строк могут быть легко получены из временных меток с базовыми знаниями R)
  • использования sapply через результаты с произвольная функция агрегирования, ge в среднем за последние 5 значения от
  • результатов положить в таймсерии с теми же индексами, которые вы использовали для раскола

Сказав это, вы бы действительно лучше Добавьте таймсерии обработки библиотеки prodiving общих процедуры агрегирования в С.