#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']