Группировка данных по году - PullRequest
1 голос
/ 29 октября 2009
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 Ответ

6 голосов
/ 29 октября 2009
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,{}), поскольку это вернет данные, когда они существуют, или {}, если их нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...