我在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], ... }
提示非常感谢
答案 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
进行分组将起作用。