Я точно не знаю, какой формат/структура данных у вас означает, что ваши исходные данные находятся, поскольку то, что вы представляете, не является точным представлением Python. Но давайте предположим, что ваши ряды списки строк (или могут быть легко преобразованы в них):
rows = [
[ '1/6/12 16:28', '1/6/12 16:55', 'e' ],
[ '1/11/12 13:18', '1/11/12 13:58', 'm' ],
[ '1/13/12 13:20', '1/13/12 13:24', 'm' ]
]
Тогда, вот один из способов вычислить среднее по классам:
from collections import Counter
from datetime import datetime
def parse(s, format="%x %H:%M"):
"""
Return parsed datetime in the given format.
"""
return datetime.strptime(s, format)
total_items = Counter()
total_duration = Counter()
for start, end, kind in rows:
duration = parse(end) - parse(start)
total_items[kind] += 1
total_duration[kind] += duration.total_seconds()
means = { k: total_duration[k]/total_items[k] for k in total_items }
print means
Это использует collections.Counter
s для отслеживания как количества каждого класса в журнале, так и продолжительности. Длительность должна быть вычислена сначала, анализируя представление строки даты/времени во внутренний формат, такой как datetime.datetime
. Как только счетчики накапливаются, понимание словаря вычисляет среднее значение для вида (что вы называете «классом», но это техническая конструкция Python, поэтому я называю это видом).
В результате means
хранит вычисленные значения. means['m']
дает среднее значение для всех записей 'm'
и т. Д.
В то время как функция parse
будет работать для нескольких образцов данных, которые вы указали в своем вопросе, синтаксический анализ даты и времени довольно утончен. Вместо использования здесь метода strptime
я рекомендую использовать более экспансивный и инклюзивный парсер, например, найденный в модуле dateutil. Если вы хотите использовать это, удалить или переименовать функцию parse
найти здесь, а также замену:
from dateutil.parser import parse
Это обеспечивает падение в замену с гораздо более широким спектром принятых форматов.