Python newb... I have a list of dicts that I am trying to organize into the same month & year:
[{'date':'2008-04-23','value':'1'}, {'date':'2008-04-01','value':'8'}, {'date':'2008-04-05','value':'3'}, {'date':'2009-04-19','value':'5'}, {'date':'2009-04-21','value':'8'}, {'date':'2010-09-09','value':'3'}, {'date':'2010-09-10','value':'4'}, ]
What I'm trying to get is a list of dicts like this:
[{'date':2008-04-01,'value':'12'}, {'date':2009-04-01,'value':'13'}, {'date':2010-09-01,'value':'7'}, ]
Here's my code, which is just printing an empty list:
from datetime import datetime myList = [{'date':'2008-04-23','value':'1'}, {'date':'2008-04-01','value':'8'}, {'date':'2008-04-05','value':'3'}, {'date':'2009-04-19','value':'5'}, {'date':'2009-04-21','value':'8'},{'date':'2010-09-09','value':'3'}, {'date':'2010-09-10','value':'4'}, ] newList = [] newDict = {} for cnt in range(len(myList)): for k,v in myList[cnt].iteritems(): if k == 'date': d = datetime.strptime(v,'%Y-%m-%d').date() for elem in newList: if elem['date'] != d: newList.append({'date':d,'value':myList[cnt]['value']}) else: newList[cnt]['value'] += myList[cnt]['value'] print newList
First, I would sort the data1:
>>> lst = [{'date':'2008-04-23','value':'1'}, ... {'date':'2008-04-01','value':'8'}, ... {'date':'2008-04-05','value':'3'}, ... {'date':'2009-04-19','value':'5'}, ... {'date':'2009-04-21','value':'8'}, ... {'date':'2010-09-09','value':'3'}, ... {'date':'2010-09-10','value':'4'}, ... ] >>> lst.sort(key=lambda x:x['date'][:7]) >>> lst [{'date': '2008-04-23', 'value': '1'}, {'date': '2008-04-01', 'value': '8'}, {'date': '2008-04-05', 'value': '3'}, {'date': '2009-04-19', 'value': '5'}, {'date': '2009-04-21', 'value': '8'}, {'date': '2010-09-09', 'value': '3'}, {'date': '2010-09-10', 'value': '4'}]
Then, I would use itertools.groupby
to do the grouping:
>>> from itertools import groupby >>> for k,v in groupby(lst,key=lambda x:x['date'][:7]): ... print k, list(v) ... 2008-04 [{'date': '2008-04-23', 'value': '1'}, {'date': '2008-04-01', 'value': '8'}, {'date': '2008-04-05', 'value': '3'}] 2009-04 [{'date': '2009-04-19', 'value': '5'}, {'date': '2009-04-21', 'value': '8'}] 2010-09 [{'date': '2010-09-09', 'value': '3'}, {'date': '2010-09-10', 'value': '4'}] >>>
Now, to get the output you wanted:
>>> for k,v in groupby(lst,key=lambda x:x['date'][:7]): ... print {'date':k+'-01','value':sum(int(d['value']) for d in v)} ... {'date': '2008-04-01', 'value': 12} {'date': '2009-04-01', 'value': 13} {'date': '2010-09-01', 'value': 7}
1Your data actually already appears to be sorted in this regard, so you might be able to skip this step.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With