Как выбрать нужный диапазон ячеек по условию?

У меня есть лист 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


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