将每日数据汇总并汇总到python中的月份

时间:2014-07-24 19:53:42

标签: python json arraylist grouping aggregate

我在Python中有一个二维列表,其中包含一天的纪元秒数和相应的值。我需要将这个列表聚合成一个月份的json数组以及所有相应的每日值的总和。

python列表如下所示:

array = [[1230768000000, 23], [1244073599000, 5], [1269206974000, 8], [1291908086000, 23]...]

我需要将它jsonify成一个看起来像这样的json数组:

[{key:'2009-01',value:28},{key:'2009-02',value:324} ... ]

我已经尝试了以下代码,但它并没有完全输出我需要的内容。

month_aggregate = defaultdict(list)
for [d,v] in array:
  truncated = int(str(d)[:-3])
  year_month = datetime.utcfromtimestamp(truncated).date().isoformat()[:-3]
  month_aggregate[year_month].append(v)

>> {'2011-08': [559, 601, 545, 578], '2011-09': [572, 491, 595], ... }

提示非常感谢

4 个答案:

答案 0 :(得分:1)

试试这个:

array = [[1230768000000, 23], [1244073599000, 5], [1269206974000, 8], [1291908086000, 23]]

month_aggregate = dict()
for [d,v] in array:
    truncated = int(str(d)[:-3])    
    year_month = datetime.utcfromtimestamp(truncated).date().isoformat()[:-3]
    # If the entry was not present previously create one with the current value v
    if not month_aggregate.has_key(year_month):
        month_aggregate[year_month] = v
    else:
        # Otherwise add the value to the previous entry
        month_aggregate[year_month] += v

# Create a JSON Array from the month_aggregate dictionary
month_aggregate_json_list = [ {'value':v, 'key':k} for k, v in month_aggregate.iteritems() ]
print month_aggregate_json_list

给出这个

[{'key': '2009-01', 'value': 23}, {'key': '2009-06', 'value': 5}, {'key': '2010-03', 'value': 8}, {'key': '2010-12', 'value': 23}]

答案 1 :(得分:0)

尝试从集合中使用Counter。我前几天发现它并且它很有用。

from collections import Counter
month_aggregate = Counter()
for [d,v] in array:
    truncated = int(str(d)[:-3])
    year_month = datetime.utcfromtimestamp(truncated).date().isoformat()[:-3]
    month_aggregate[year_month] += v
    [{"key":k, "value":v} for k,v in month_aggregate.items()]

给出:

[{'key': '2009-06', 'value': 5},
 {'key': '2010-03', 'value': 8},
 {'key': '2010-12', 'value': 23},
 {'key': '2009-01', 'value': 23}]

答案 2 :(得分:0)

以下答案使用了Collections中的Counter类,这可能是此问题的最佳/最快数据类型

from operator import add
from collections import Counter

l = [[1230768000000, 23], [1244073599000, 5], [1269206974000, 8], [1291908086000, 23]]

getDate = lambda x: time.strftime('%Y-%m', time.localtime(x/1000))
counter = reduce(add,[Counter({getDate(key):val}) for key,val in l])

此时你有一个很好的Collections数据类型包含你所有的信息,如果你真的想把它转换回json只是使用list comprehension ...

json = [{'key':k,'value':v} for k,v in counter.iteritems()]

答案 3 :(得分:0)

这正是itertools中groupby的意思。 Group by返回迭代器,它将使用给定函数来确定属于该项的组,并为每个迭代该组中所有项的组返回迭代器。

from itertools import groupby
from time import gmtime, strftime 
# gmtime uses the UTC timezone, use the function localtime if preferred

def get_year_month_from_datum((millis, _value)):
    return strftime("%Y-%m", gmtime(millis / 1000))

aggregate = {key: sum(value for _time, value in values)
    for key, values in groupby(array, get_year_month_from_datum)} 

json_aggr = [{"key": key, "value": sum(value for _time, value in values)} 
    for key, values in groupby(array, get_year_month_from_datum)]

groupby函数假定输入数组已根据分组值排序,如果没有,则按sorted(array)而不是array进行分组将起作用。