Python: Как я могу бросить первые 5 минут каждого дня в мою серию времени?

У меня есть датафрейм со столбцами: дата транзакции, время транзакции и цена. Я хочу бросить первые и последние 5 минут в каждый день.

Вот пример:

----------------------------------------
Date       | Time         | Price
----------------------------------------
03/03/2014 | 09:36:36.814 |  43.90
---------------------------------------
03/03/2014 | 09:37:02.381  | 43.40
---------------------------------------
03/03/2014 | 09:41:02.381  | 43.40
---------------------------------------
03/03/2014 | 09:50:02.381  | 43.40
---------------------------------------

Я хочу получить этот вывод:

----------------------------------------
Date       | Time         | Price
---------------------------------------
03/03/2014 | 09:50:02.381  | 43.40
---------------------------------------

Мне нужно сделать это для каждого дня. Я попробовал этот код:

  trades14081.insert(2,'DateTime',pd.to_datetime(trades14081['Date']+trades14081['Time'], format = "%d/%m/%Y%H:%M:%S.%f" ))
delta=datetime.timedelta(minutes=5)
i=0
j=0
start=[]
end=[]
while trades14081['Date'][i]==trades14081['Date'][j] and j<len(trades14081):
    if trades14081['DateTime'][j]-trades14081['DateTime'][i]<delta:
        j=j+1
    else:
        start.append(i)
        end.append(j)
        j=j+1
        while trades14081['Date'][i]==trades14081['Date'][j] and j<len(trades14081):
            j=j+1
        i=j
for i in range(len(start)):
    trades14081=trades14081.drop(trades14081.index[start[i]:end[i]])

Но я продолжаю получать эту ошибку:

KeyError: 19996

>      12             l.append(j)
>      13             j=j+1
> ---> 14             while trades14081['Date'][i]==trades14081['Date'][j]:
>      15                 j=j+1
>      16             i=j

19996 - это длина моих сделок с фреймами данных14081.

Есть идеи?

1 ответ

groupby + Логическое индексирование

Вы можете и должны избегать петель уровня Python. Здесь вы можете использовать groupby:

# convert strings to timedelta
df['Time'] = pd.to_timedelta(df['Time'])

# define offset from start to omit
offset = pd.Timedelta(minutes=5)

# apply Boolean filter to dataframe
res = df.loc[df['Time'] > df.groupby('Date')['Time'].transform('min') + offset]

print(res)

          Date     Time  Price
4  03/03/2014  09:40:00     41
5  03/03/2014  09:46:00     42
Другие вопросы по тегам