Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting dataframe raises error of ordinal value must be >= 1

I follow the tutorial at http://nbviewer.ipython.org/github/jvns/pandas-cookbook/blob/v0.1/cookbook/Chapter%205%20-%20Combining%20dataframes%20and%20scraping%20Canadian%20weather%20data.ipynb

I have a pandas dataframe

weather_mar2012['Temp (°C)']

Out[30]:

Date/Time
2012-03-01 00:00:00   -5.5
2012-03-01 01:00:00   -5.7
2012-03-01 02:00:00   -5.4

When trying to plot it i get an error

weather_mar2012['Temp (°C)'].plot(figsize=(15, 5))



--------------------------------------------------------------------------- 
ValueError                                Traceback (most recent call last) <ipython-input-31-21c79ba7d5ef> in <module>()
----> 1 weather_mar2012['Temp (°C)'].plot(figsize=(15, 5))

/home/vagrant/anaconda3/lib/python3.4/site-packages/pandas/tools/plotting.py in plot_series(data, kind, ax, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, label, secondary_y, **kwds)    2486                  yerr=yerr, xerr=xerr,    2487                  label=label, secondary_y=secondary_y,
-> 2488                  **kwds)    2489     2490 

/home/vagrant/anaconda3/lib/python3.4/site-packages/pandas/tools/plotting.py in _plot(data, x, y, subplots, ax, kind, **kwds)    2292         plot_obj = klass(data, subplots=subplots, ax=ax, kind=kind, **kwds)    2293 
-> 2294     plot_obj.generate()    2295     plot_obj.draw()    2296     return plot_obj.result

/home/vagrant/anaconda3/lib/python3.4/site-packages/pandas/tools/plotting.py in generate(self)
    922         self._make_legend()
    923         self._post_plot_logic()
--> 924         self._adorn_subplots()
    925 
    926     def _args_adjust(self):

/home/vagrant/anaconda3/lib/python3.4/site-packages/pandas/tools/plotting.py in _adorn_subplots(self)    1052                     ax.set_xticklabels(xticklabels)    1053                 self._apply_axis_properties(ax.xaxis, rot=self.rot,
-> 1054                                            fontsize=self.fontsize)    1055             elif self.orientation == 'horizontal':    1056                 if self._need_to_set_index:

/home/vagrant/anaconda3/lib/python3.4/site-packages/pandas/tools/plotting.py in _apply_axis_properties(self, axis, rot, fontsize)    1061     1062  def _apply_axis_properties(self, axis, rot=None, fontsize=None):
-> 1063         labels = axis.get_majorticklabels() + axis.get_minorticklabels()    1064         for label in labels:    1065             if rot is not None:

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/axis.py in get_majorticklabels(self)    1155     def get_majorticklabels(self):    1156         'Return a list of Text instances for the major ticklabels'
-> 1157         ticks = self.get_major_ticks()    1158         labels1 = [tick.label1 for tick in ticks if tick.label1On]    1159         labels2 = [tick.label2 for tick in ticks if tick.label2On]

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/axis.py in get_major_ticks(self, numticks)    1284         'get the tick instances; grow as necessary'    1285         if numticks is None:
-> 1286             numticks = len(self.get_major_locator()())    1287         if len(self.majorTicks) < numticks:    1288             # update the new tick label properties from the old

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/dates.py in __call__(self)
    863     def __call__(self):
    864         'Return the locations of the ticks'
--> 865         self.refresh()
    866         return self._locator()
    867 

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/dates.py in refresh(self)
    880     def refresh(self):
    881         'Refresh internal information based on current limits.'
--> 882         dmin, dmax = self.viewlim_to_dt()
    883         self._locator = self.get_locator(dmin, dmax)
    884 

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/dates.py in viewlim_to_dt(self)
    624     def viewlim_to_dt(self):
    625         vmin, vmax = self.axis.get_view_interval()
--> 626         return num2date(vmin, self.tz), num2date(vmax, self.tz)
    627 
    628     def _get_unit(self):

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/dates.py in num2date(x, tz)
    343         tz = _get_rc_timezone()
    344     if not cbook.iterable(x):
--> 345         return _from_ordinalf(x, tz)
    346     else:
    347         x = np.asarray(x)

/home/vagrant/anaconda3/lib/python3.4/site-packages/matplotlib/dates.py in _from_ordinalf(x, tz)
    223         tz = _get_rc_timezone()
    224     ix = int(x)
--> 225     dt = datetime.datetime.fromordinal(ix)
    226     remainder = float(x) - ix
    227     hour, remainder = divmod(24 * remainder, 1)

ValueError: ordinal must be >= 1

What does it mean?

How can i fix this?

like image 802
David Michael Gang Avatar asked Nov 26 '14 13:11

David Michael Gang


1 Answers

I was getting this error in ipython even with current pandas 0.20.3

Traced it down to having run a script beforehand which saved a figure with a different index, but hadn't done plt.show() as the figure had been saved and I didn't need to see it.

So as @naught101 hinted, forcing plt.close('all') before showing the next figure fixes the issue. Probably good practice at the end of scripts anyway.

like image 151
Mat Avatar answered Oct 03 '22 06:10

Mat