Подсчет действий на основе последовательных значений в данных временных рядов в python - PullRequest
0 голосов
/ 30 марта 2020

В кадре данных временного ряда 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

Было бы еще лучше, если бы мы могли отобразить эти действия на графике, чтобы проверить детали.

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