Почему pandas генерирует KeyError при поиске даты в таблице, проиндексированной по дате? - PullRequest
3 голосов
/ 11 ноября 2019

Рассмотрим следующий код:

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 при создании индекса, но не при поиске элемента) мне кажется нелогичным. По какой причине это было реализовано таким образом? Есть ли какой-то стиль кодирования, которому следует следовать, чтобы избежать подобных ошибок? Или это ошибка, которую я должен подать?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Этого можно избежать, выбрав позиции с помощью DataFrame.iat и Index.get_loc для позиции столбца a:

print(df.iat[0, df.columns.get_loc('a')])
#alternative
#print(df.iloc[0, df.columns.get_loc('a')])
1

Другая идеядля выбора используется df.index date_index[0]:

print(df.at[df.index[0], 'a'])
2 голосов
/ 11 ноября 2019

Я думаю, что это ошибка, которую вы обнаружили в 0.24.2, она работает на моей системе python 3.7.2 и pandas 0.25.3:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...