Это не проблема с пустяками, это проблема с пандами.Проблема в том, что 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