#python #pandas #numpy
#python #pandas #numpy
Вопрос:
Я знаю, что вы можете выбирать данные из pandas.DatetimeIndex с использованием pandas.DataFrame.between_time. Есть ли удобный способ исключить между двумя временами pandas
?
Например, чтобы исключить данные между 16:00 и 17:00, я в настоящее время делаю следующее.
In [1]: import pandas as pd
import numpy as np
In [2]: df = pd.DataFrame(np.random.randn(24 * 60 1, 2), columns=list("AB"), index=pd.date_range(start="20161013 00:00:00", freq="1T", periods=24 * 60 1))
In [3]: idx = df.index.hour == 16
In [4]: df = df[~idx]
In [5]: df.between_time("16:00", "17:00")
Out[5]:
A B
2016-10-13 17:00:00 -0.745892 1.832912
Редактировать
Я смог использовать это:
In[41]:df2 = df.ix[np.setdiff1d(df.index, df.between_time("16:00", "17:00").index)]
In[42]:df2.between_time("15:59", "17:01")
Out[42]:
A B
2016-10-13 15:59:00 1.190678 0.783776
2016-10-13 17:01:00 -0.590931 -1.059962
Есть ли лучший способ?
Комментарии:
1. Звучит как ошибка
Ответ №1:
Вы можете комбинировать between_time
с drop
:
df2 = df.drop(df.between_time("16:00", "17:00").index)
Редактировать
Альтернативный метод заключается в использовании того факта, что between_time
он работает по кругу, поэтому вы можете переключать порядок времени ввода, чтобы исключить диапазон между ними:
df.between_time("17:00", "16:00", include_start=False, include_end=False)
Ответ №2:
df['hour'] = df.index.hour
df[(df['hour'] < 16) | (df['hour'] > 17)]
Комментарии:
1. Я понимаю, что мы можем сделать это
df.ix[(df.index.hour > 16) | (df.index.hour < 17)]
даже без использования дополнительного столбца, но я ищу общее решение между любыми двумя временами. Это не работает, если вам нужны данные, исключающие, скажем, 16:23 и 16:53: 52.2. Я ответил на конкретную проблему, которая изначально существовала, но вы правы. Вы можете создать пользовательскую функцию для фильтрации за вас. Рассмотрим вызываемую функцию
filtWithin
, которая принимает временную метку, время начала и время окончания и возвращает True всякий раз, когда временная метка находится за пределами этого окна. Тогда вы могли бы сделать этоdf[df.apply(lambda x: filtWithin(x.index, 12, startTime, endTime), axis=1)]