Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

KeyError when plotting a sliced pandas dataframe with datetimes

Tags:

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 
like image 612
joris Avatar asked Sep 13 '12 12:09

joris


People also ask

How do I stop pandas from KeyError?

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.

What is KeyError in pandas?

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.


1 Answers

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> 
like image 195
Wouter Overmeire Avatar answered Mar 01 '23 20:03

Wouter Overmeire