Рассмотрим следующий код:
date_index = np.array(['2019-01-01', '2019-01-02'], dtype=np.datetime64)
df = pd.DataFrame({'a': np.array([1, 2])}, index=date_index)
date_to_lookup = date_index[0]
print(df.at[date_to_lookup, 'a'])
Можно ожидать, что он сработает и напечатает 1. Тем не менее (по крайней мере в Python Anaconda 3.7.3
с пандами 0.24.2
) происходит сбой со следующей ошибкой:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../site-packages/pandas/core/indexing.py", line 2270, in __getitem__
return self.obj._get_value(*key, takeable=self._takeable)
File ".../site-packages/pandas/core/frame.py", line 2771, in _get_value
return engine.get_value(series._values, index)
File "pandas/_libs/index.pyx", line 81, in pandas._libs.index.IndexEngine.get_value
File "pandas/_libs/index.pyx", line 89, in pandas._libs.index.IndexEngine.get_value
File "pandas/_libs/index.pyx", line 447, in pandas._libs.index.DatetimeEngine.get_loc
File "pandas/_libs/hashtable_class_helper.pxi", line 987, in pandas._libs.hashtable.Int64HashTable.get_item
File "pandas/_libs/hashtable_class_helper.pxi", line 993, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 17897
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. 1014 * при создании индекса, но не делает этого при поиске элемента в этом индексе. Я мог бы избежать ошибки выше, преобразовав ключ в 'datetime64[ns]'
. Например, обе следующие строки успешно напечатали 1
:
print(df.at[pd.to_datetime(date_to_lookup), 'a'])
print(df.at[date_to_lookup.astype('datetime64[ns]'), 'a'])
Такое поведение (автоматическое преобразование dtype при создании индекса, но не при поиске элемента) мне кажется нелогичным. По какой причине это было реализовано таким образом? Есть ли какой-то стиль кодирования, которому следует следовать, чтобы избежать подобных ошибок? Или это ошибка, которую я должен подать?