Исключение между временем в pandas

#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)]