df['value_group'] = df['is_first'].cumsum()
start = df.groupby('value_group', as_index=False).nth(0)
end = df.groupby('value_group', as_index=False).nth(-1)
start_end = pd.DataFrame({'start': start.index, 'end': end.index + pd.
    Timedelta(freq), 'value': start[0]})
start_end['duration'] = (start_end['end'] - start_end['start']).apply(float
    ) / 1000000000.0
agg = start_end.groupby('value').agg(['mean', 'count'])['duration']
agg['mean'] = agg['mean'] / (60 * 60)
Рассчитайте продолжительность состояния с помощью pandas Dataframe