Список групп по годам и подгруппа по месяцам в python - PullRequest
0 голосов
/ 10 сентября 2018

Допустим, у меня есть такой список:

list = [["A",datetime.datetime(1985,8,31,0,0)], ["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)],["D",datetime.datetime(2014,6,9,0,0)], ["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]

Как я могу наиболее элегантно сгруппировать это по году и подгруппу по месяцам, чтобы получить вывод этого списка в Python, такой как:

newlist = [["A",datetime.datetime(1985,8,31,0,0)], [[["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)]],["D",datetime.datetime(2014,6,9,0,0)]], [["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]]

Таким образом, значения сгруппированы по годам, а затем по месяцам, и порядок сохраняется Я импортирую модуль datetime в мой код

import datetime

и применение strptime

kdate=year/month/day
date = datetime.datetime.strptime(kdate , "%m/%d/%Y")

Чем я сохраняю дату в списке. Список выглядит так, как указано выше

1 Ответ

0 голосов
/ 10 сентября 2018

Используя itertools.groupby , вы можете группировать по годам, а затем по месяцам.

Выражение немного сложное и требует сортировки исходного списка перед применением любого выражения groupby, но оно позволяет получить приличный результат.

newlist = [[list(subgroup) for _, subgroup in groupby(group, key=lambda i: i[1].strftime("%m"))] for _, group in groupby(sorted(mylist, key=lambda i: i[1].strftime("%Y%m%d")), key=lambda i: i[1].strftime("%Y"))]

Исходный список отсортирован по году, месяцу и дню с использованием шаблона CCYYMMDD. Отсортированный список затем группируется по годам. Результирующий список в конечном итоге сгруппирован по месяцам.

Это вернет список из трех уровней, состоящий из:

  • Подсписки, перечисляющие каждый отдельный год, присутствующий в вашем первоначальном списке.
  • Годовые подсписки состоят из подсписков, перечисляющих каждый отдельный месяц относительно года.
  • Списки месяцев в конечном итоге состоят из групп, относящихся как к месяцу, так и к году. Эти самые нижние списки отсортированы по возрастанию.

Вот результат, полученный из вашего списка:

[[[['A', datetime.datetime(1985, 8, 31, 0, 0)]]], [[['B', datetime.datetime(2014, 4, 3, 0, 0)], ['C', datetime.datetime(2014, 4, 4, 0, 0)]], [['D', datetime.datetime(2014, 6, 9, 0, 0)]]], [[['F', datetime.datetime(2015, 2, 7, 0, 0)]], [['E', datetime.datetime(2015, 6, 1, 0, 0)]]]]

Это не совсем то, что вы ожидаете. Но интерес этой структуры в том, что она уважает иерархию дней, вложенных в месяцы, а месяцы - в годы. Его можно легко использовать в качестве входных данных для структуры цикла (например).

for year in newlist:
    for month in year:
        for day in month:
            # some code here.

Надеюсь, это поможет.

...