Если я добавлю пропущенные скобки в WO
, чтобы избавиться от синтаксических ошибок (которые вы действительно должны были проверить перед публикацией):
WO = {datetime.date(2014, 12, 20): {'V1': [11, 15, 19], 'V2': [12, 3, 4], 'V3': [50, 55, 56], 'V4': [100, 112, 45]}, datetime.date(2014, 12, 22): {'V1': [107, 172, 79], 'V2': [124, 43, 44], 'V3': [503, 552, 561], 'V4': [1000, 1128, 457]}, datetime.date(2014, 12, 21): {'V1': [10, 12, 9], 'V2': [16, 13, 40], 'V3': [150, 155, 156], 'V4': [1100, 1132, 457]}}
Затем я могу сделать это, чтобы увидеть, какие номера неделинаходятся в данных:
>>> for date, values in WO.items():
year, week, _ = date.isocalendar()
print (date,year,week)
, и я вижу, что в этом примере вы хотите агрегировать две недели:
2014-12-20 2014 51
2014-12-22 2014 52
2014-12-21 2014 51
То есть ваши данные относятся к неделям ISO 51и 52 из 2014. Вы консолидируете по неделям, поэтому у ваших агрегированных данных будет ключ (year, week)
, но без дня.(Вам нужен год, потому что в ваших данных могут быть разные годы.) Итак, вы хотите построить dict
с ключами (2014, 51)
и (2014, 52)
.У каждого будет 3 значения, связанных с "V1"
- "V4"
, потому что на этой неделе только один день, и консолидировать нечего.Другая неделя будет иметь 6 значений, связанных с "V1"
- "V4"
, поскольку в данных есть две недели для этой недели.
Начните с пустого dict
, чтобы содержать сводку:
>>> summary = {}
Перебирайте даты, чтобы найти номера лет и недели, как и раньше, но на этот раз собирайте данные в соответствии с клавишами (year, week)
:
>>> for date, values in WO.items():
year, week, _ = date.isocalendar()
if (year, week) not in summary:
summary [(year, week)] = {vn: [] for vn in values} # empty lists for vn = 'V1' - 'V4'
for vn in values:
summary[(year, week)][vn].extend(values[vn])
>>> summary
{(2014, 51): {'V1': [11, 15, 19, 10, 12, 9], 'V2': [12, 3, 4, 16, 13, 40], 'V3': [50, 55, 56, 150, 155, 156], 'V4': [100, 112, 45, 1100, 1132, 457]}, (2014, 52): {'V1': [107, 172, 79], 'V2': [124, 43, 44], 'V3': [503, 552, 561], 'V4': [1000, 1128, 457]}}