Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I group this list of dicts by the same month?

Tags:

python

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    
like image 731
user2312507 Avatar asked Apr 23 '13 18:04

user2312507


1 Answers

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.

like image 178
mgilson Avatar answered Oct 14 '22 21:10

mgilson