Панды выбирают строки с заданным интервалом времени - PullRequest
1 голос
/ 10 июля 2019

У меня большой массив данных в виде

timestamp | col1 | col2 ...

Я хочу выбрать строки с интервалом не менее x минут, где x может быть 5,10,30 и т. Д. Проблема заключается в том, что временные метки не разделены одинаково, поэтому я не могу сделать простой "взятие каждого nth ряд "трюк.

Пример:

timestamp | col1 | col2

'2019-01-15 17:52:29.955000', x, b
'2019-01-15 17:58:29.531000', x, b
'2019-01-16 03:21:48.255000', x, b
'2019-01-16 03:27:46.324000', x, b
'2019-01-16 03:33:09.984000', x, b
'2019-01-16 07:22:08.170000', x, b
'2019-01-16 07:28:27.406000', x, b
'2019-01-16 07:34:35.194000', x, b

если интервал = 10:

результат:

'2019-01-15 17:52:29.955000', x, b
'2019-01-16 03:21:48.255000', x, b
'2019-01-16 03:33:09.984000', x, b
'2019-01-16 07:22:08.170000', x, b
'2019-01-16 07:34:35.194000', x, b

если интервал = 30:

результат:

'2019-01-15 17:52:29.955000', x, b
'2019-01-16 03:21:48.255000', x, b
'2019-01-16 07:22:08.170000', x, b

Я мог бы использовать подход грубой силы n ^ 2, но я уверен, что есть способ панды для этого, которого мне не хватает ..

Спасибо! :)

РЕДАКТИРОВАТЬ: Это не дубликат Рассчитать разницу во времени между индексами Dandrame Dataframe просто для пояснения. Мне нужно установить подкадр данных на основе заданного интервала

1 Ответ

2 голосов
/ 10 июля 2019

Как и в комментариях, похоже, вам нужно сделать цикл for. И это не так уж плохо, потому что вы делаете цикл O(n):

def sampling(df, thresh):
    thresh = pd.to_timedelta(thresh)
    time_diff = df.timestamp.diff().fillna(pd.Timedelta(seconds=0))
    ret = [0]
    running_total = pd.to_timedelta(0)
    for i in df.index:
        running_total += time_diff[i]
        if running_total >= thresh:
            ret.append(i)
            running_total = pd.to_timedelta(0)

    return df.loc[ret].copy()

Тогда sampling(df, '10T') дает

                timestamp col1 col2
0 2019-01-15 17:52:29.955    x    b
2 2019-01-16 03:21:48.255    x    b
4 2019-01-16 03:33:09.984    x    b
5 2019-01-16 07:22:08.170    x    b
7 2019-01-16 07:34:35.194    x    b

и sampling(df, '30T') дает:

                timestamp col1 col2
0 2019-01-15 17:52:29.955    x    b
2 2019-01-16 03:21:48.255    x    b
5 2019-01-16 07:22:08.170    x    b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...