【问题标题】:Plotting dataframe raises error of ordinal value must be >= 1绘制数据框引发序值错误必须> = 1
【发布时间】:2017-07-29 23:19:10
【问题描述】:

我按照http://nbviewer.ipython.org/github/jvns/pandas-cookbook/blob/v0.1/cookbook/Chapter%205%20-%20Combining%20dataframes%20and%20scraping%20Canadian%20weather%20data.ipynb的教程进行操作

我有一个熊猫数据框

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

当试图绘制它时,我得到一个错误

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

什么意思?

我该如何解决这个问题?

【问题讨论】:

  • 由于某些原因,您似乎收到了错误消息。如果不查看数据,很难确定。也许您可以尝试重置索引,使用pd.to_datetime 强制列更新,然后再次将其设置为索引?
  • 已经是时间序列weather_mar2012.index [2012-03-01 00:00:00, ..., 2012-03-31 23:00:00] 长度:744,频率:无,时区:无
  • 我也看到了这个...在重置和删除索引后也使用相同的数据帧获取它,所以我认为这与索引无关。
  • aaand 关闭现有的开放情节使问题消失。可能是因为我尝试绘制两个索引不一致的不同数据帧。
  • hmmm...想知道这是否是一个错误——naught101 救了我。没有打开情节——但之前必须在 pandas 中进行过绘图操作失败?虽然无法重现...

标签: python matplotlib pandas


【解决方案1】:

即使使用当前的 pandas 0.20.3,我在 ipython 中也遇到此错误

追溯到事先运行了一个脚本,该脚本保存了一个具有不同索引的图形,但由于该图形已保存并且我不需要查看它而没有完成plt.show()

正如@naught101 所暗示的,在显示下一个数字之前强制plt.close('all') 可以解决问题。无论如何,在脚本结束时可能是一种很好的做法。

【讨论】:

    【解决方案2】:

    这是 pandas 中的一个错误:0.18.1 并在 0.19.2 中修复,例如运行 conda upgrade pandas

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 2017-12-28
      • 2019-07-11
      • 1970-01-01
      • 2019-09-03
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多