Окей, это не лучший вариант, но когда у вас большие фреймы данных, это может быть простой подход.(Если идет дождь в начале или в конце, это будет проигнорировано в этом примере. См. Предупреждение)
import pandas as pd
import numpy as np
# generate pseudo dataframe
rng = pd.date_range('1/1/2012', periods=20, freq='H')
rain = np.random.choice([0,0.5,1,2], size=20, p=[0.4,0.2,0.2,0.2])
df = pd.DataFrame()
df['data'] = rng
df['rain'] = rain
# convert rain to boolean
df['is_rain'] = df['rain'] > 0
# shift rain for one slot to recognice if the state has changed
data = list(df['is_rain'].values[0:-1])
shifted = [data[0]]
shifted.extend(data)
df['is_rain_next'] = shifted
# get start and endpoints of rain (the end has to be excluded!
# it is always the next period, when it isn't raining anymore)
df['rain_start'] = df['is_rain'] < df['is_rain_next']
df['rain_end'] = df['is_rain'] > df['is_rain_next']
# this are the starts and ends you can use them for getting the groups from dataframe
df[df['rain_start']].index
df[df['rain_end']].index
Предупреждение : массивы могут иметь разные размеры, вызванныенеизвестное состояние в конце и в начале.Поэтому проверьте, меньше ли первый элемент в rain_end, чем первый элемент в rain_start, чем вы можете его удалить.Также, если последний элемент rain_start больше, чем последний элемент rain_end (звучит логично, я думаю)