这是我的数据格式:
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 :(得分: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