Как написать условие цикла так, чтоб учитывалась дата?

Как можно написать цикл так, что он применялся к каждому году в массиве? Допустим есть такой массив:

Табл.1

Начало Конец Продолжительность Сумма
2016-10-07 2016-10-23 16 -114.3
2016-11-08 2016-11-10 3 3.5
2017-01-01 2017-03-15 75 -961.4
2017-11-11 2017-12-31 51 -962.4
2018-03-17 2018-03-29 13 -86.1
2018-04-02 2018-10-06 188 2287.6
2019-10-07 2018-10-13 7 -18.9
2019-10-14 2019-10-18 5 4.2
2020-10-23 2020-11-07 16 -114.3
2020-11-11 2020-12-31 51 -962.4

Нужно, чтобы суммировались значения в колонке "Сумма" отдельно по каждому году и выводились Нужно, чтобы в новый массив отдельно по каждому году с такими же заголовками выводилась первая и последняя дата года, продолжительность, и сумма. Чтобы получилось следующее:

Табл.2

Начало Конец Продолжительность Сумма
2016-10-07 2016-11-10 19 -110.8
2017-01-01 2017-12-31 126 -1923.8
2018-03-17 2018-10-06 201 2207,5
2019-10-07 2019-10-18 12 -14,7
2020-10-23 2020-12-31 67 -1076,7

Ответы (1 шт):

Автор решения: MaxU

Попробуйте так:

agg_funcs = {
  "Начало": "min", 
  "Конец": "max", 
  "Продолжительность": "sum", 
  "Сумма": "sum"
}

res = (df
       .assign(yr=df["Начало"].dt.year)
       .groupby("yr")
       .agg(agg_funcs)
       .reset_index()
       .drop(columns="yr"))

Результат:

In [133]: res
Out[133]:
      Начало      Конец  Продолжительность   Сумма
0 2016-10-07 2016-11-10                 19  -110.8
1 2017-01-01 2017-12-31                126 -1923.8
2 2018-03-17 2018-10-06                201  2201.5
3 2019-10-07 2019-10-18                 12   -14.7
4 2020-10-23 2020-12-31                 67 -1076.7

PS для того, чтобы данное решение правильно отрабатывало, столбец Начало должен иметь тип данных datetime. Если у вас в нем строки - следует сначала преобразовать его в datetime:

df["Начало"] = pd.to_datetime(df["Начало"], errors="coerce")
→ Ссылка