在计算行值时按日期对列表进行分组

时间:2014-02-18 11:57:29

标签: python python-2.7 google-visualization big-o

这是我的数据格式:

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内部命令可以允许我在计算行值时按行字段分组。

1 个答案:

答案 0 :(得分: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