Python: группировка результатов по временным интервалам - PullRequest
7 голосов
/ 26 февраля 2010

У меня большие данные, загруженные из маринованного файла. Данные представляют собой отсортированный список кортежей, содержащий дату и время, например int

[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
  (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
  (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
  etc
]

Я хочу получить плотность населения на основе некоторых временных интервалов. Например, я хочу получить количество записей за 5 минут / 1 минуту / 30 секунд.

Какой лучший способ сделать это? Я знаю, что могу просто пройтись по каждому экземпляру в списке, но искал лучший подход (если таковой существует).

Желаемый вывод будет выглядеть примерно так:

2010-01-01 04:10:00  --- 5000
2010-02-04 10:05:00  --- 4000
2010-01-02 13:25:00  --- 3999

Ответы [ 2 ]

6 голосов
/ 26 февраля 2010

Выезд itertools.groupby. Вы можете передать функцию, которая вычисляет правильное ведро в качестве ключа. Затем вы можете запустить свои агрегации (подсчеты, средние значения, что у вас есть) по группам в получаемой итерации.

5 голосов
/ 27 февраля 2010

bisect.bisect - это еще один способ решения этой проблемы:

import datetime
import bisect
import collections

data=[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
  (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
  (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
]
interval=datetime.timedelta(minutes=1,seconds=30)
start=datetime.datetime(2010, 2, 26, 12, 6, 4)
grid=[start+n*interval for n in range(10)]
bins=collections.defaultdict(list)
for date,num in data:
    idx=bisect.bisect(grid,date)
    bins[idx].append(num)
for idx,nums in bins.iteritems():
    print('{0} --- {1}'.format(grid[idx],len(nums)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...