В кадре данных временного ряда df
:
id timestamp data
27581 27822 2020-01-02 07:53:05.173 19.5
27582 27823 2020-01-02 07:53:05.273 20.0
27647 27888 2020-01-02 10:01:46.380 20.5
27648 27889 2020-01-02 10:01:46.480 21.0
27649 27890 2020-01-02 10:01:48.463 21.5
27650 27891 2020-01-02 10:01:48.563 22.0
27711 27952 2020-01-02 10:32:19.897 21.5
27712 27953 2020-01-02 10:32:19.997 21.0
27861 28102 2020-01-02 11:34:41.940 21.5
...
Я хотел бы посчитать и записать действия, где data
находится между 31 и 35 для больше 20 секунд последовательно. Но данные записываются каждый раз, когда происходит изменение на 0,5 в абсолютных значениях, независимо от времени, поэтому отметка времени записывается с нерегулярными интервалами.
Надеюсь, я смогу получить все действия в таблице следующим образом:
id start_time end_time
0 2020-01-02 07:53:05.173 2020-01-02 07:54:04.563
1 2020-01-02 08:53:05.273 2020-01-02 07:53:05.273
2 2020-01-02 10:01:46.380 2020-01-02 10:01:59.380
3 2020-01-02 10:21:46.480 2020-01-02 10:22:10.480
...
, где start_time
и end_time
- отметка времени первых и последних данных в диапазоне 31-35. ,
Я пытался:
def data_interval(df):
range_df = []
df1=df[df['data']>0]
df1=df1.drop_duplicates(['timestamp'])
df1=df1.sort_values(by=['timestamp'])
status = 0 # Let 0 represent data out of desired range, and 1 data in desired range.
for i in range(len(df1)):
if status == 0:
if ((df1.loc[i, 'data'] >= 31) and
(df1.loc[i, 'data'] <= 35)):
data_in_range = df1.loc[i, 'data']
start_time = df1.loc[i, 'timestamp']
continue
if status == 1:
if ((df1.loc[i, 'data'] < 31) or
(df1.loc[i, 'data'] > 35)):
end_time = df1.loc[i, 'timestamp']
range_df.append([data_in_range,
start_time,
end_time])
status = 0
continue
final_df=pd.DataFrame(range_df,columns=['Data','Start_time', 'End_time'])
return final_df
final_df = data_interval(df)
final_df
, который возвращал ошибку
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2896 try:
-> 2897 return self._engine.get_loc(key)
2898 except KeyError:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
KeyError: 0
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
8 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2897 return self._engine.get_loc(key)
2898 except KeyError:
-> 2899 return self._engine.get_loc(self._maybe_cast_indexer(key))
2900 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
2901 if indexer.ndim > 1 or indexer.size > 1:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
KeyError: 0
Было бы еще лучше, если бы мы могли отобразить эти действия на графике, чтобы проверить детали.