I get a KeyError when I try to plot a slice of a pandas DataFrame column with datetimes in it. Does anybody know what could cause this?
I managed to reproduce the error in a little self contained example (which you can also view here: http://nbviewer.ipython.org/3714142/):
import numpy as np from pandas import DataFrame import datetime from pylab import * test = DataFrame({'x' : [datetime.datetime(2012,9,10) + datetime.timedelta(n) for n in range(10)], 'y' : range(10)})
Now if I plot:
plot(test['x'][0:5])
there is not problem, but when I plot:
plot(test['x'][5:10])
I get the KeyError below (and the error message is not very helpfull to me). This only happens with datetime columns, not with other columns (as far as I experienced). E.g. plot(test['y'][5:10])
is not a problem.
Ther error message:
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-aa076e3fc4e0> in <module>() ----> 1 plot(test['x'][5:10]) C:\Python27\lib\site-packages\matplotlib\pyplot.pyc in plot(*args, **kwargs) 2456 ax.hold(hold) 2457 try: -> 2458 ret = ax.plot(*args, **kwargs) 2459 draw_if_interactive() 2460 finally: C:\Python27\lib\site-packages\matplotlib\axes.pyc in plot(self, *args, **kwargs) 3846 lines = [] 3847 -> 3848 for line in self._get_lines(*args, **kwargs): 3849 self.add_line(line) 3850 lines.append(line) C:\Python27\lib\site-packages\matplotlib\axes.pyc in _grab_next_args(self, *args, **kwargs) 321 return 322 if len(remaining) <= 3: --> 323 for seg in self._plot_args(remaining, kwargs): 324 yield seg 325 return C:\Python27\lib\site-packages\matplotlib\axes.pyc in _plot_args(self, tup, kwargs) 298 x = np.arange(y.shape[0], dtype=float) 299 --> 300 x, y = self._xy_from_xy(x, y) 301 302 if self.command == 'plot': C:\Python27\lib\site-packages\matplotlib\axes.pyc in _xy_from_xy(self, x, y) 215 if self.axes.xaxis is not None and self.axes.yaxis is not None: 216 bx = self.axes.xaxis.update_units(x) --> 217 by = self.axes.yaxis.update_units(y) 218 219 if self.command!='plot': C:\Python27\lib\site-packages\matplotlib\axis.pyc in update_units(self, data) 1277 neednew = self.converter!=converter 1278 self.converter = converter -> 1279 default = self.converter.default_units(data, self) 1280 #print 'update units: default=%s, units=%s'%(default, self.units) 1281 if default is not None and self.units is None: C:\Python27\lib\site-packages\matplotlib\dates.pyc in default_units(x, axis) 1153 'Return the tzinfo instance of *x* or of its first element, or None' 1154 try: -> 1155 x = x[0] 1156 except (TypeError, IndexError): 1157 pass C:\Python27\lib\site-packages\pandas\core\series.pyc in __getitem__(self, key) 374 def __getitem__(self, key): 375 try: --> 376 return self.index.get_value(self, key) 377 except InvalidIndexError: 378 pass C:\Python27\lib\site-packages\pandas\core\index.pyc in get_value(self, series, key) 529 """ 530 try: --> 531 return self._engine.get_value(series, key) 532 except KeyError, e1: 533 if len(self) > 0 and self.inferred_type == 'integer': C:\Python27\lib\site-packages\pandas\_engines.pyd in pandas._engines.IndexEngine.get_value (pandas\src\engines.c:1479)() C:\Python27\lib\site-packages\pandas\_engines.pyd in pandas._engines.IndexEngine.get_value (pandas\src\engines.c:1374)() C:\Python27\lib\site-packages\pandas\_engines.pyd in pandas._engines.DictIndexEngine.get_loc (pandas\src\engines.c:2498)() C:\Python27\lib\site-packages\pandas\_engines.pyd in pandas._engines.DictIndexEngine.get_loc (pandas\src\engines.c:2460)() KeyError: 0
We can avoid KeyError by using get() function to access the key value. If the key is missing, None is returned. We can also specify a default value to return when the key is missing.
Pandas KeyError occurs when we try to access some column/row label in our DataFrame that doesn't exist. Usually, this error occurs when you misspell a column/row name or include an unwanted space before or after the column/row name.
HYRY explained why you get the KeyError. To plot with slices using matplotlib you can do:
In [157]: plot(test['x'][5:10].values) Out[157]: [<matplotlib.lines.Line2D at 0xc38348c>] In [158]: plot(test['x'][5:10].reset_index(drop=True)) Out[158]: [<matplotlib.lines.Line2D at 0xc37e3cc>]
x, y plotting in one go with 0.7.3
In [161]: test[5:10].set_index('x')['y'].plot() Out[161]: <matplotlib.axes.AxesSubplot at 0xc48b1cc>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With