Odd pandas date slicing behavior (doesn't slice day)

Viewed 45

I could be missing something here but I believe that there is something odd going on with pandas datetime slicing. Here is a reproducible example:

import pandas as pd
import pandas_datareader as pdr

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

testdf['2020-11']

Here we can see that slicing to find the month's data returns the expected output. However, now lets try to find the row corresponding to Nov 9 2020.

testdf['2020-11-09']

And we get the following traceback.

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2894             try:
-> 2895                 return self._engine.get_loc(casted_key)
   2896             except KeyError as err:

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

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

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_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:\Anaconda\lib\site-packages\pandas\core\frame.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:\Anaconda\lib\site-packages\pandas\core\indexes\base.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'

Here we can see that the key is in fact in the index:

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)

Is this a bug or am I a bug?

1 Answers

testdf['2020-11-09'] slice column-wise, i.e. looking in columns for '2020-11-09'. Do you mean:

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