2016-07-30 2 views
1

Индексирование панд DatetimeIndex (с DTYPE Numpy datetime64 [нс]) возвращает либо:Панды DatetimeIndex индексирование DTYPE: datetime64 против Timestamp

  • другой DatetimeIndex для нескольких индексов
  • панды Отметка для одного индекса

Запутанная части является то, что Timestamps не равны np.datetime64, так что:

import numpy as np 
import pandas as pd 

a_datetimeindex = pd.date_range('1/1/2016', '1/2/2016', freq = 'D') 
print np.in1d(a_datetimeindex[0], a_datetimeindex) 

Возвращает false. Но:

print np.in1d(a_datetimeindex[0:1], a_datetimeindex) 
print np.in1d(np.datetime64(a_datetimeindex[0]), a_datetimeindex) 

Возвращает правильные результаты.

Я думаю, это потому, что np.datetime64 [ns] имеет точность до наносекунды, но временная метка усечена?

Мой вопрос в том, есть ли способ создать DatetimeIndex, чтобы он всегда индексировал один и тот же (или сопоставимый) тип данных?

ответ

1

Вы используете функции numpy для управления типами панд. Они не всегда совместимы.

Функция np.in1d сначала преобразует оба аргумента в ndarrays. A DatetimeIndex имеет встроенное преобразование и возвращается массив dtype np.datetime64 (это DatetimIndex.values). Но у Timestamp нет такого объекта, и он не преобразован.

Вместо этого, вы можете использовать, например, питон ключевое слово in (самый естественный путь):

a_datetimeindex[0] in a_datetimeindex 

или Index.isin метод для сбора элементов

a_datetimeindex.isin(a_list_or_index) 

Если вы хотите использовать np.in1d, явно преобразовать оба аргумента в типы numpy. Или называть его на нижележащих Numpy массивы:

np.in1d(a_datetimeindex.values[0], a_datetimeindex.values) 

С другой стороны, это, вероятно, безопасно использовать np.in1d с двумя коллекциями одного и того же типа:

np.in1d(a_datetimeindex, another_datetimeindex) 

или даже

np.in1d(a_datetimeindex[[0]], a_datetimeindex) 
+0

Отлично, что работает, спасибо! – user3217125

Смежные вопросы