Найти временные сегменты по условиям в данных временных рядов - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть данные df:

Timestamp = pd.date_range('2020-02-06 08:23:04', periods=1000, freq='s')
df = pd.DataFrame({'Timestamp': Timestamp,
                   'Data': 30+15*np.cos(np.linspace(0,10,Timestamp.size))})

df['timediff'] = (df['Timestamp'].shift(-1) - df['Timestamp']).dt.total_seconds()   
df['datadiff'] = df['Data'].shift(-1) - df['Data']
df['gradient'] = df['datadiff'] / df['timediff']

Я хочу найти временные сегменты с gradient> 0,13. Таким образом, start является первой точкой данных в этом диапазоне, а end является последней точкой данных в диапазоне, сделайте это для всего df.

Ожидаемый результат:

Start               Start_Data  End                 End_Data
2020-02-06 08:30:50 29.284407   2020-02-06 08:30:58 30.485252
                       ...  

1 Ответ

0 голосов
/ 18 апреля 2020

Вот как я буду действовать:

df['test'] = (df.gradient > 0.13).astype('int') 
# identifies changes in test condition
df["value_grp"] = (df.test.diff(1) != 0).astype("int").cumsum()

# Filter the groups with test condition being true and look at begin and end times
df.groupby('value_grp').filter(lambda x: (x.test==1).all()).Timestamp.min()
df.groupby('value_grp').filter(lambda x: (x.test==1).all()).Timestamp.max()

Надеюсь, это поможет.

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