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