NumPy isin вопрос для отметок времени? - PullRequest
0 голосов
/ 29 сентября 2018

У меня странная проблема с функцией np.isin.Если я создаю короткий pd.DatetimeIndex и дату, которая существует в этом индексе:

test_index = pd.date_range(start='2000-01-01', end='2000-01-15',freq='B')
test_date = test_index[0]

, я могу проверить, что test_date на самом деле является первым элементом индекса:

test_date == test_index[0]
True

Но функция np.isin, похоже, не может распознать test_date внутри test_index:

np.isin(test_index, test_date)
array([False, False, False, False, False, False, False, False, False,
       False])

Это происходит, если я пишу это как

np.isin(test_index.values, test_date)

Это кажется неправильным и странным.Тип данных test_date и test_index [0] задан как pd.Timestamp, и между ними нет видимой разницы.Любая помощь с благодарностью получена.

1 Ответ

0 голосов
/ 29 сентября 2018

Это не проблема с пустяками, это проблема с пандами.Проблема в том, что pd.date_range создает DatetimeIndex, который является индексом особого типа и хранит объекты не так, как вы получаете, когда получаете к ним доступ.С документы на DatetimeIndex:

Неизменяемый массив данных datetime64, представленный внутри как int64, и который может быть помещен в упаковку для объектов Timestamp, которые являются подклассами datetime и переносят метаданныетакие как информация о частоте.

Это трудно разобрать.«Массив type1 данных, представленных как type2, который дает вам type3 объектов при индексировании.»

Я на самом деле не получаю одинаковый тип для каждого из Панд;тип test_date равен pandas._libs.tslib.Timestamp для Pandas 0.22.0, что соответствует данной документации.

>>> test_index.dtype 
dtype('<M8[ns]')

>>> type(test_date)
pandas._libs.tslib.Timestamp

Как указано в документации, у этого Timestamp есть дополнительные метаданные, которые плохо преобразуются в numpy:

>>> np.array(test_date)
array(Timestamp('2000-01-03 00:00:00', freq='B'), dtype=object)

Вы можете видеть, что я только что получил объект ...этот объект определенно не тот, что хранится в DatetimeIndex.Это то, что действительно происходит неявно в NumPy.Из документов по np.isin() (в разделе «Примечания»):

Если test_elements является набором (или другой непоследовательной коллекцией), он будет преобразован в массив объектовс одним элементом.

Итак, как мы видим, значение помещается в этот массив object вместо массива datetime64, поэтому вы не найдете свой объект в *Массив 1040 *.

Лучше всего использовать встроенные методы для DatetimeIndex для его поиска, но вы также можете явно разыграть его, чтобы numpy знал, что происходит.Вот несколько способов сделать это:

>>> np.isin(test_index, np.datetime64(test_date))
array([ True, False, False, False, False, False, False, False, False,
   False])
>>> test_index == test_date
array([ True, False, False, False, False, False, False, False, False,
   False])
>>> test_index.isin([test_date])
array([ True, False, False, False, False, False, False, False, False,
   False])
>>> test_index.contains(test_date) # if you just need yes or no
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...