2016-08-10 3 views
0

У меня есть временной ряд в объекте dataframe python pandas, и я хочу создать группу на основе индекса, но я хочу, чтобы перекрывающиеся группы группы были не различны. Header_sec является столбцом индекса. Каждая группа состоит из 2-секундного окна. Input dataFramegroupby с интервалами с перекрывающимися интервалами

header_sec 
1 17004 days 22:17:13 
2 17004 days 22:17:13 
3 17004 days 22:17:13 
4 17004 days 22:17:13 
5 17004 days 22:17:14 
6 17004 days 22:17:14 
7 17004 days 22:17:14 
8 17004 days 22:17:14 
9 17004 days 22:17:15 
10 17004 days 22:17:15 
11 17004 days 22:17:15 
12 17004 days 22:17:15 
13 17004 days 22:17:16 
14 17004 days 22:17:16 
15 17004 days 22:17:16 
16 17004 days 22:17:16 
17 17004 days 22:17:17 
18 17004 days 22:17:17 
19 17004 days 22:17:17 
20 17004 days 22:17:17 

Моя первая группа должна иметь

1 17004 days 22:17:13 
2 17004 days 22:17:13 
3 17004 days 22:17:13 
4 17004 days 22:17:13 
5 17004 days 22:17:14 
6 17004 days 22:17:14 
7 17004 days 22:17:14 
8 17004 days 22:17:14 

Вторая группа начинается с предыдущего индекса и занимает 1/2 записей в предыдущем секунду.

7 17004 days 22:17:14 
8 17004 days 22:17:14 
9 17004 days 22:17:15 
10 17004 days 22:17:15 
11 17004 days 22:17:15 
12 17004 days 22:17:15 
13 17004 days 22:17:16 
14 17004 days 22:17:16 

Третья группа .....

13 17004 days 22:17:16 
14 17004 days 22:17:16 
15 17004 days 22:17:16 
16 17004 days 22:17:16 
17 17004 days 22:17:17 
18 17004 days 22:17:17 
19 17004 days 22:17:17 
20 17004 days 22:17:17 

Если я GroupBy по индексу,

dfgroup=df.groupby(df.index) 

это дает одну группу в секунду. Что было бы лучшим способом объединить эти группы?

+0

Есть всегда будет 4 записи в секунду? – SO44

+0

Нет, так как отсутствуют данные. Это фактически образцы, собранные в секунду. Фактические данные имеют 100 выборок в секунду, но иногда есть недостающая запись. – AMisra

+0

Примеры в вашем вопросе несовместимы. Вторая группа занимает 2 строки с 22:17:14, но третья группа не берет ни одного из 22:17:15. Первая группа принимает все значения с 22:17:15, но вторая группа не принимает все значения с 22:17:16. Не могли бы вы прояснить? Я думаю, вам нужны все значения из заданного второго + последнего 2 значения из предыдущих секунд + первые 2 значения из следующей секунды. Верный? – Kartik

ответ

1

Вот техник:

import numpy as np # if you have not already done this 

grouped = df.groupby(df.index) 

for name, group in grouped: 
    try: 
     prev_sec = df.loc[(name - pd.to_timedelta(1, unit='s')), :] 
    except KeyError: 
     prev_sec = pd.DataFrame(columns=group.columns) 
    try: 
     next_sec = df.loc[(name + pd.to_timedelta(1, unit='s')), :] 
    except KeyError: 
     next_sec = pd.DataFrame(columns=group.columns) 
    Pn = 2 # replace this with int(len(prev_sec)/2) to get half rows from previous second 
    Nn = 2 # replace this with int(len(next_sec)/2) to get half rows from next second 
    group = pd.concat([prev_sec.iloc[-Pn:,:], group, next_sec.iloc[:Nn,:]]) 

    # Replace the below lines with your operations 
    print(name, group) 
+0

Я получаю сообщение об ошибке в этой строке prev_sec = df [df ['header_sec']. Isin (name - pd.to_timedelta (1, unit = 's'))], поскольку «header sec» - это индекс, а не столбец. Я попытался заменить его на df [df [df.index] .isin (name - pd.to_timedelta (1, unit = 's'))], но все же дает ключевую ошибку «TimedeltaIndex (['17004 days 22:17:13 ',' 17004 days 22:17:13 ', \ n' 17004 days 22:17:13 ',' 17004 days ..... not in index " – AMisra

+0

Отредактировал свой ответ. Вам нужно' df [df.index. isin (...)] '. – Kartik

+0

Я тоже это пробовал, но он по-прежнему дает ошибку, только объекты, подобные списку, могут быть переданы isin(), вы передали [Timedelta]. Это потому, что мой индекс уже timedelta Это то, что я делаю перед groupby df.loc [:, ['header_stamp_secs_x']] = pd.to_timedelta (df.header_stamp_secs_x, unit = 's') df.set_index ('header_stamp_secs_x', inplace = True) – AMisra

Смежные вопросы