Как написать условие цикла так, чтоб учитывалась дата?
Как можно написать цикл так, что он применялся к каждому году в массиве? Допустим есть такой массив:
Табл.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")