Предположим, у нас есть набор данных CSV, как вы упомянули (без первой строки):
76 School 4/12/2018
111 Post Office 4/15/2018
112 School 4/10/2018
324 School 2/10/2018
22 Library 4/12/2018
19 Library 4/13/2028
17 Post Office 5/11/2018
76 Library 4/25/2018
19 Library 4/27/2019
112 School 3/23/2018
76 Post Office 4/27/2018
113 Ice Cream 5/23/2018
19 School 7/23/2019
112 Library 3/23/2018
76 Ice Cream 6/4/2019
112 Fountain 6/10/2019
Затем мы можем использовать пользовательскую сортировку () для сортировки данных так, как вам нужно:
import csv
import datetime
l = []
with open('stack.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
l.append(row)
l.sort(key = lambda x: (int(x[0]), datetime.datetime.strptime(x[2], '%m/%d/%Y')))
[print(i) for i in l]
Это даст вам следующий вывод (отсортированный по ID и дате):
['17', 'PO', '05/11/2018']
['19', 'L', '04/27/2019']
['19', 'S', '07/23/2019']
['19', 'L', '04/13/2028']
['22', 'L', '04/12/2018']
['76', 'S', '04/12/2018']
['76', 'L', '04/25/2018']
['76', 'IC', '06/04/2019']
['76', 'PO', '04/27/2020']
['111', 'PO', '04/15/2018']
['112', 'S', '02/23/2018']
['112', 'L', '03/23/2018']
['112', 'S', '04/10/2018']
['112', 'F', '06/10/2019']
['113', 'IC', '05/23/2018']
['324', 'S', '02/10/2018']
Добавление группы к этому выводу может быть выполнено с использованием для l oop:
f_id = l[0][0]
group = 1
for i in l:
if f_id != i[0]:
group = 1
f_id = i[0]
i.append(group)
group+=1
Это даст вам ваш вывод:
['17', 'PO', '05/11/2018', 1]
['19', 'L', '04/27/2019', 1]
['19', 'S', '07/23/2019', 2]
['19', 'L', '04/13/2028', 3]
['22', 'L', '04/12/2018', 1]
['76', 'S', '04/12/2018', 1]
['76', 'L', '04/25/2018', 2]
['76', 'IC', '06/04/2019', 3]
['76', 'PO', '04/27/2020', 4]
['111', 'PO', '04/15/2018', 1]
['112', 'S', '02/23/2018', 1]
['112', 'L', '03/23/2018', 2]
['112', 'S', '04/10/2018', 3]
['112', 'F', '06/10/2019', 4]
['113', 'IC', '05/23/2018', 1]
['324', 'S', '02/10/2018', 1]
Затем вы можете записать этот список обратно в файл CSV с вашими заголовками