Как выбрать нужный диапазон ячеек по условию?
У меня есть лист ecxel в котором содержаться данные температуры за каждый день. Мне нужно выделить устойчивый период (начало и конец), когда температура выше 0°. Дата устойчивого перехода через 0° определяется путем сопоставления положительных или отрицательных сумм отклонения температур. Положительным отклонение считается, если температура превышает 0°, отрицательным - не превышает 0°. За дату устойчивого перехода весной принимается первый день периода, сумма положительных отклонений которого превышает сумму отрицательных отклонений любого из последующих периодов с отрицательными отклонениями. Осенью наоборот - концом периода будет считаться первый день того периода, сумма отрицательных отклонений которого превышает сумму положительных отклонений любого из последующих периодов с такими отклонениями. Пример весенних температур в таблице
| Начало | Конец | Сумма отклонений |
|---|---|---|
| 17.04 | 30.04 | +5,3° |
| 01.05 | 02.05 | -3,8° |
| 03.05 | 05.05 | +8,3° |
| 06.05 | 13.05 | -6,7° |
| 14.05 | 16.05 | +8,6° |
| 17.05 | 17.05 | -1,1° |
| 18.05 | 31.05 | +61,1° |
В таблице видно, что датой устойчивого перехода считается 03.05, потому что сумма положительных отклонений этого периода выше любого следующего периода с отрицательными отклонениями. Суммы отклонений сравниваются по модулю: |+8,3°| > |-6,7°|. Датой перехода не считается 17.04 так как |+5,3°| < |-6,7°|.
Во фрейме я присваиваю ячейке значений True в столбце Deviation, если за эту дату температура выше 0.
for i, g in df_warm[df_warm['Темп'] > 0].groupby((df_warm['Темп'] >= 0).cumsum()):
df_warm.loc[g.index, "Deviation"] = True
Потом находим периоды отрицательных и положительных отклонений и их суммы.
for i, g in df_warm[df_warm['Deviation'] == False].groupby((df_warm['Deviation'] == True).cumsum()):
date_start = g['Дата'].iloc[0].date() # вычисляем начало периода
date_finish = g['Дата'].iloc[-1].date() # вычисляем конец периода
long = len(g) # высчитываем длину периода
temp_sum = g.loc[g["Темп"] < 0, "Темп"].sum() # суммируем температуры за период
warm.loc[len(warm)] = [date_start, date_finish, long, temp_sum] # записываем строку во фрейм данных
for i, g in df_warm[df_warm['Deviation'] == True].groupby((df_warm['Deviation'] == False).cumsum()):
date_start = g['Дата'].iloc[0].date() # вычисляем начало периода
date_finish = g['Дата'].iloc[-1].date() # вычисляем конец периода
long = len(g) # высчитываем длину периода
temp_sum = g.loc[g["Темп"] >= 0, "Темп"].sum() # суммируем температуры за период
warm.loc[len(warm)] = [date_start, date_finish, long, temp_sum] # записываем строку во фрейм данных
Как мне прописать условие так, чтобы весной находить дату положительных отклонений, сумма которого будет выше любого следующего периода с отрицательными отклонениями? А осенью дату отрицательных отклонений, сумма которого будет выше любого следующего периода с положительными отклонениями? А после этого находить сумму положительных температур этого периода (с весны до осени) без учета отрицательных температур, которые могут попасть в этот период?
Ссылка на ecxel файл https://yadi.sk/i/FcHpzjchm2uJYA