2014-02-18 4 views
1

Это формат моих данных:группа список по дате во время подсчета строк значений

Date hits returning 
2014/02/06 10 0 
2014/02/06 25 0 
2014/02/07 11 0 
2014/02/07 31 1 
2014/02/07 3 2 
2014/02/08 6 0 
2014/02/08 4 3 
2014/02/08 17 0 
2014/02/08 1 0 
2014/02/09 6 0 
2014/02/09 8 1 

Требуемая мощность является:

date, sum_hits, sum_returning, sum_total 
2014/02/06 35 0 35 
2014/02/07 44 3 47 
2014/02/08 28 3 31 
2014/02/09 14 1 15 

Выход для использования Google Charts

Для получения уникальной даты и подсчета значений для каждой строки я создаю словарь, а с помощью даты имеет ключ, что-то вроде:

# hits = <object with the input data> 
data = {} 
for h in hits: 
    day = h.day_hour.strftime('%Y/%m/%d') 
    if day in data: 
     t_hits = int(data[day][0] + h.hits) 
     t_returning = int(data[day][1] + h.returning) 
     data[day] = [t_hits, t_returning, t_hits + t_returning] 
    else: 
     data[day] = [ 
      h.hits, 
      h.returning, 
      int(h.hits + h.returning)] 

Это создает что-то вроде:

{ 
    '2014/02/06' = [35 0 35], 
    '2014/02/07' = [44 3 47], 
    '2014/02/08' = [28 3 31], 
    '2014/02/09' = [14 1 15] 
} 

И для создания требуемой выходной мощности, что я делаю это:

array() 
for k, v in data.items(): 
    row = [k] 
    row.extend(v) 
    array.append(row) 

, который создает массив с требуемым форматом:

[ 
[2014/02/06, 35, 0, 35], 
[2014/02/07, 44, 3, 47], 
[2014/02/08, 28, 3, 31], 
[2014/02/09, 14, 1, 15], 
] 

Итак, мой вопрос в основном заключается в том, если есть лучший способ сделать это, или некоторая внутренняя команда python, которая позволяет мне группировать по строкам поля при подсчете значений строк.

+0

Ваш вход отсортирован по дате? –

+0

да, отсортировано по дате – nbari

+0

Тогда ответ ниже - правильный подход; используйте 'groupby'. –

ответ

1

Если ваш вход всегда отсортирован (или если вы можете его отсортировать), вы можете использовать itertools.groupby, чтобы упростить некоторые из этих. groupby, как следует из названия, группирует входные элементы с помощью ключа и дает вам итерабельность (group_key, list_of_values_in_group). Что-то вроде следующего должно работать:

import itertools 

# the keyfunc extracts the key from each input element 
keyfunc = lambda row: row.day_hour.strftime("%Y/%m/%d") 

data = [] 
for day, day_rows in itertools.groupby(hits, key=keyfunc): 
    sum_hits = 0 
    sum_returning = 0 
    for row in day_rows: 
     sum_hits += int(row.hits) 
     sum_returning += int(row.returning) 
    data.append([day, sum_hits, sum_returning, sum_hits + sum_returning]) 

# data now contains your desired output 
Смежные вопросы