Сгенерировал мои собственные данные:
np.random.seed(0)
rng = pd.date_range('2015-02-25', periods=15, freq='T')
df = pd.DataFrame({ 'Timestamp': rng, 'data': [1,2,3,4,5,40,47,8,9,10,30,12,13,40,20], 'id':[0,1,0,0,0,0,0,1,0,0,0,0,1,0,0] })
df
Группа на основе кластера идентификаторов с использованием cumsum
df['group'] = df['id'].cumsum().reindex()
df
Выбор начала каждой группы в другом кадре данных df2
и переименуйте метку времени в дату
df2=df[df.id.eq(1) & df.id.shift(-1).eq(0)]
df2.drop(columns=['data','id'], inplace=True)
df2.rename(columns={'Timestamp':'Date'}, inplace=True)
Объедините новый фрейм данных df2
с df
и приведите дату назад к дате / времени
result = pd.merge(df, df2, on='group', how='outer')
result['Date']=pd.to_datetime(result['Date'])
result
маскировать все случаи, где data==40
n =df['data']==40
Применяя маску, рассчитайте промежуток времени между start=1
и data==40
, если это когда-либо произойдет. Благоразумно, что вы отбрасываете Date
, потому что мы закончили с этим
result['x']=result.loc[n,'Timestamp']-result.loc[n,'Date']
result.drop(columns=['Date'],inplace=True)
result
Вывод