Как удалить индекс, если время не входит в последовательную группу? - PullRequest
0 голосов
/ 07 октября 2019

Если у меня есть пандас DataFrame со столбцом даты и времени, подобным этому:

 2018-01-16 01:51:10
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:59    
 2018-01-16 01:57:59    
 2018-01-16 01:57:59    
 2018-01-16 01:58:00     
 2018-01-16 01:58:00    
 2018-01-16 01:58:01    
 2018-01-16 01:58:01
 2018-01-16 02:00:00
 2018-01-16 02:45:01    
 2018-01-16 02:45:01    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:03    
 2018-01-16 02:45:04     
 2018-01-16 02:45:04    
 2018-01-16 02:45:05    
 2018-01-16 02:45:06    
 2018-01-16 02:45:07    
 2018-01-16 02:45:07    
 2018-01-16 02:45:08    
 2018-01-16 02:58:55    

Как удалить время, которое не относится к группам / выбросам, такое, что если время больше 1 секундыот группы раз это отбрасывается. Я хочу получить фрейм данных для панд:

 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:58    
 2018-01-16 01:57:59    
 2018-01-16 01:57:59    
 2018-01-16 01:57:59    
 2018-01-16 01:58:00     
 2018-01-16 01:58:00    
 2018-01-16 01:58:01    
 2018-01-16 01:58:01
 2018-01-16 02:45:01    
 2018-01-16 02:45:01    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:02    
 2018-01-16 02:45:03    
 2018-01-16 02:45:04     
 2018-01-16 02:45:04    
 2018-01-16 02:45:05    
 2018-01-16 02:45:06    
 2018-01-16 02:45:07    
 2018-01-16 02:45:07    
 2018-01-16 02:45:08    

1 Ответ

1 голос
/ 07 октября 2019

Пример данных:

import pandas as pd

idx = [
    "2018-01-16 01:51:10", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:59", "2018-01-16 01:57:59", "2018-01-16 01:57:59", "2018-01-16 01:58:00", "2018-01-16 01:58:00", "2018-01-16 01:58:01", "2018-01-16 01:58:01", "2018-01-16 02:00:00", "2018-01-16 02:45:01", "2018-01-16 02:45:01", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:03", "2018-01-16 02:45:04", "2018-01-16 02:45:04", "2018-01-16 02:45:05", "2018-01-16 02:45:06", "2018-01-16 02:45:07", "2018-01-16 02:45:07", "2018-01-16 02:45:08", "2018-01-16 02:58:55",
]

df = pd.DataFrame(range(len(idx)), index=idx, columns=["col"])
df.index = pd.to_datetime(df.index)

Возьмите первые различия в обоих направлениях:

bdiff = np.abs((df.index[1:] - df.index[:-1]).total_seconds())
fdiff = np.abs((df.index[:-1] - df.index[1:]).total_seconds())

Теперь каждый из них фактически на один элемент слишком короткий;bdiff исключает первый элемент, а fdiff исключает последний. Итак, дополните их:

bdiff = np.insert(bdiff, 0, 99.)
fdiff = np.append(fdiff, 99.)

Наконец, сформируйте из этого логическую маску;маска True, где значение находится на расстоянии более одной секунды от обоих окружающих ее значений:

>>> mask = (bdiff > 1.0) & (fdiff > 1.0) 
... print(df.loc[~mask])                                                                                                                                     
                     col
2018-01-16 01:57:58    1
2018-01-16 01:57:58    2
2018-01-16 01:57:58    3
2018-01-16 01:57:58    4
2018-01-16 01:57:58    5
2018-01-16 01:57:59    6
2018-01-16 01:57:59    7
2018-01-16 01:57:59    8
2018-01-16 01:58:00    9
2018-01-16 01:58:00   10
2018-01-16 01:58:01   11
2018-01-16 01:58:01   12
2018-01-16 02:45:01   14
2018-01-16 02:45:01   15
2018-01-16 02:45:02   16
2018-01-16 02:45:02   17
2018-01-16 02:45:02   18
2018-01-16 02:45:02   19
2018-01-16 02:45:03   20
2018-01-16 02:45:04   21
2018-01-16 02:45:04   22
2018-01-16 02:45:05   23
2018-01-16 02:45:06   24
2018-01-16 02:45:07   25
2018-01-16 02:45:07   26
2018-01-16 02:45:08   27

>>> mask                                                                                                                                                     
array([ True, False, False, False, False, False, False, False, False,
       False, False, False, False,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False,  True])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...