Рассчитать временной интервал на основе условий в кадре данных в Python - PullRequest
1 голос
/ 12 апреля 2020

У меня есть временной ряд данных df, как показано ниже:

                        id      timestamp                data   Date         sig      events1   Start   Peak   gradient 
timestamp                                   
2020-01-15 06:12:49.213 40250   2020-01-15 06:12:49.213  20.0   2020-01-15  -1.0      0.0       NaN     1.0    0.000148
2020-01-15 06:12:49.313 40251   2020-01-15 06:12:49.313  19.5   2020-01-15   1.0      1.0       0.0     0.0    0.000294
2020-01-15 08:05:10.083 40256   2020-01-15 08:05:10.083  20.0   2020-01-15   1.0      0.0       1.0     0.0    0.000339
2020-01-15 08:05:10.183 40257   2020-01-15 08:05:10.183  20.5   2020-01-15   1.0      0.0       0.0     0.0    0.000334
2020-01-15 09:01:50.993 40310   2020-01-15 09:01:50.993  21.0   2020-01-15   1.0      0.0       0.0     0.0    0.000000
2020-01-15 09:01:51.093 40311   2020-01-15 09:01:51.093  21.5   2020-01-15   1.0      0.0       0.0     0.0   -0.008618

Я хотел бы найти для каждой строки Start==1 до следующей строки Start==1 продолжительность (в секундах) ) что от текущего data требуется data>=40, если data когда-либо достигнет 40. Если data никогда не достигал 40, выведите 0. Какой хороший способ сделать это?

1 Ответ

1 голос
/ 15 апреля 2020

Сгенерировал мои собственные данные:

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

Вывод

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...