Нечетное поведение при нарезке даты pandas (не влияет на день)

#python-3.x #pandas #datetime

#python-3.x #pandas #дата и время

Вопрос:

Возможно, я что-то здесь упускаю, но я считаю, что с нарезкой даты и времени pandas происходит что-то странное. Вот воспроизводимый пример:

 import pandas as pd
import pandas_datareader as pdr

testdf = pdr.DataReader('SPY', 'yahoo')
testdf.index = pd.to_datetime(testdf.index)

testdf['2020-11']
  

Здесь мы видим, что нарезка для поиска данных за месяц возвращает ожидаемый результат.
Однако теперь давайте попробуем найти строку, соответствующую 9 ноября 2020 года.

 testdf['2020-11-09']
  

И мы получаем следующую трассировку.

 ---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
C:Anacondalibsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)
   2894             try:
-> 2895                 return self._engine.get_loc(casted_key)
   2896             except KeyError as err:

pandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '2020-11-09'

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
<ipython-input-78-a42a45b5c3a4> in <module>
----> 1 testdf['2020-11-09']

C:Anacondalibsite-packagespandascoreframe.py in __getitem__(self, key)
   2900             if self.columns.nlevels > 1:
   2901                 return self._getitem_multilevel(key)
-> 2902             indexer = self.columns.get_loc(key)
   2903             if is_integer(indexer):
   2904                 indexer = [indexer]

C:Anacondalibsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)
   2895                 return self._engine.get_loc(casted_key)
   2896             except KeyError as err:
-> 2897                 raise KeyError(key) from err
   2898 
   2899         if tolerance is not None:

KeyError: '2020-11-09'
  

Здесь мы видим, что ключ фактически находится в индексе:

 testdf['2020-11'].index

DatetimeIndex(['2020-11-02', '2020-11-03', '2020-11-04', '2020-11-05',
               '2020-11-06', '2020-11-09'],
              dtype='datetime64[ns]', name='Date', freq=None)
  

Это ошибка или я ошибка?

Ответ №1:

testdf['2020-11-09'] нарезать по столбцам, т. Е. Искать в столбцах '2020-11-09' . Вы имеете в виду:

 testdf.loc['2020-11-09']