2009-10-29 77 views
1
mydata = [{'date': datetime.datetime(2009, 1, 31, 0, 0), 'value': 14, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 2, 28, 0, 0), 'value': 84, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 3, 31, 0, 0), 'value': 77, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 4, 30, 0, 0), 'value': 80, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 5, 31, 0, 0), 'value': 6, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 6, 30, 0, 0), 'value': 16, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 7, 31, 0, 0), 'value': 16, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 8, 31, 0, 0), 'value': 1, 'year': u'2009'}, 
      {'date': datetime.datetime(2009, 9, 30, 0, 0), 'value': 9, 'year': u'2009'}, 
      {'date': datetime.datetime(2008, 1, 31, 0, 0), 'value': 77, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 2, 29, 0, 0), 'value': 60, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 3, 31, 0, 0), 'value': 28, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 4, 30, 0, 0), 'value': 9, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 5, 31, 0, 0), 'value': 74, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 6, 30, 0, 0), 'value': 70, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 7, 31, 0, 0), 'value': 75, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 8, 31, 0, 0), 'value': 7, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 9, 30, 0, 0), 'value': 10, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 10, 31, 0, 0), 'value': 54, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 11, 30, 0, 0), 'value': 55, 'year': u'2008'}, 
      {'date': datetime.datetime(2008, 12, 31, 0, 0), 'value': 40, 'year': u'2008'}, 
      {'date': datetime.datetime(2007, 12, 31, 0, 0), 'value': 93, 'year': u'2007'},] 

在'mydata'中,我得到了连续的每月数据列表。我写了一些代码将它们分组。年的分组数据

partial_req_data = dict([(k,[f for f in v]) for k,v in itertools.groupby(mydata, key=lambda x : x.get('year'))]) 

现在我还需要一些有效的代码来填补缺失的月份,即空字典。有不好的方法来做到这一点,但我正在寻找好的。

required_data = {"2009": [{'date': datetime.datetime(2009, 1, 31, 0, 0), 'value': 14, 'year': u'2009' }, 
        {'date': datetime.datetime(2009, 2, 28, 0, 0), 'value': 84, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 3, 31, 0, 0), 'value': 77, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 4, 30, 0, 0), 'value': 80, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 5, 31, 0, 0), 'value': 6, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 6, 30, 0, 0), 'value': 16, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 7, 31, 0, 0), 'value': 16, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 8, 31, 0, 0), 'value': 1, 'year': u'2009'}, 
        {'date': datetime.datetime(2009, 9, 30, 0, 0), 'value': 9, 'year': u'2009'}, 
        {}, {}, {}], 

     "2008": [{'date': datetime.datetime(2008, 1, 31, 0, 0), 'value': 77, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 2, 29, 0, 0), 'value': 60, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 3, 31, 0, 0), 'value': 28, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 4, 30, 0, 0), 'value': 9, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 5, 31, 0, 0), 'value': 74, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 6, 30, 0, 0), 'value': 70, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 7, 31, 0, 0), 'value': 75, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 8, 31, 0, 0), 'value': 7, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 9, 30, 0, 0), 'value': 10, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 10, 31, 0, 0), 'value': 54, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 11, 30, 0, 0), 'value': 55, 'year': u'2008'}, 
        {'date': datetime.datetime(2008, 12, 31, 0, 0), 'value': 40, 'year': u'2008'},] 

     "2007": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, 
        {'date': datetime.datetime(2007, 12, 31, 0, 0), 'value': 93, 'year': u'2007'}] 
     } 
+1

作为一个无关的......您不需要代码片段中的所有'\'字符,因为隐含的行继续可以在这里工作,它看起来更干净,没有'\'。 – JonahSan 2009-10-29 12:54:50

回答

6
import datetime 
from itertools import groupby 
from pprint import pprint 

required_data={} 
for k,g in groupby(mydata,key=lambda x: x.get('year')): 
    partial={} 
    for datum in g: 
     partial[datum.get('date').month]=datum  
    required_data[k]=[partial.get(m,{}) for m in range(1,13)] 
pprint(required_data) 

每一年K,partial是一个字典的键是几个月。 诀窍是使用partial.get(m,{}),因为这会在数据存在时返回数据,或者在不存在数据时返回。

+0

辉煌。让我们看看其他人。 – simplyharsh 2009-10-29 13:04:37

+0

很好的解决方案。我会用(imho better)key = operator.itemgetter(“year”)替换key = lambda x:x.get('year') – 2009-10-29 13:33:42

+0

我必须接受这个。但我仍然乐意提供有效答案。谢谢Unutbu。 – simplyharsh 2009-10-29 14:01:52