如何修复 pandas / matplotlib 错误: raise ValueError(f'Date ordinal {x} converts to {dt}..

问题:

你正在尝试使用类似以下代码绘制 pandas DataFrame 或 Series

plot_workaround.py
df.plot()

但你会看到类似这样的错误消息

matplotlib_date_ordinal_error.txt
Traceback (most recent call last):
  ...
  File "/usr/local/lib/python3.11/site-packages/matplotlib/figure.py", line 3390, in savefig
    self.canvas.print_figure(fname, **kwargs)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/backend_bases.py", line 2164, in print_figure
    self.figure.draw(renderer)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/artist.py", line 95, in draw_wrapper
    result = draw(artist, renderer, *args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/matplotlib/artist.py", line 72, in draw_wrapper
    return draw(artist, renderer)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/matplotlib/figure.py", line 3154, in draw
    mimage._draw_list_compositing_images(
  File "/usr/local/lib/python3.11/site-packages/matplotlib/image.py", line 132, in _draw_list_compositing_images
    a.draw(renderer)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/artist.py", line 72, in draw_wrapper
    return draw(artist, renderer)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/matplotlib/axes/_base.py", line 3034, in draw
    self._update_title_position(renderer)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/axes/_base.py", line 2969, in _update_title_position
    bb = ax.xaxis.get_tightbbox(renderer)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/axis.py", line 1334, in get_tightbbox
    ticks_to_draw = self._update_ticks()
  File "/usr/local/lib/python3.11/site-packages/matplotlib/axis.py", line 1276, in _update_ticks
    major_labels = self.major.formatter.format_ticks(major_locs)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/ticker.py", line 216, in format_ticks
    return [self(value, i) for i, value in enumerate(values)]
  File "/usr/local/lib/python3.11/site-packages/matplotlib/ticker.py", line 216, in <listcomp>
    return [self(value, i) for i, value in enumerate(values)]
  File "/usr/local/lib/python3.11/site-packages/matplotlib/dates.py", line 649, in __call__
    result = num2date(x, self.tz).strftime(self.fmt)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/dates.py", line 543, in num2date
    return _from_ordinalf_np_vectorized(x, tz).tolist()
  File "/usr/local/lib/python3.11/site-packages/numpy/lib/function_base.py", line 2372, in __call__
    return self._call_as_normal(*args, **kwargs)
  File "/usr/local/lib/python3.11/site-packages/numpy/lib/function_base.py", line 2365, in _call_as_normal
    return self._vectorize_call(func=func, args=vargs)
  File "/usr/local/lib/python3.11/site-packages/numpy/lib/function_base.py", line 2455, in _vectorize_call
    outputs = ufunc(*inputs)
  File "/usr/local/lib/python3.11/site-packages/matplotlib/dates.py", line 362, in _from_ordinalf
    raise ValueError(f'Date ordinal {x} converts to {dt} (using

解决方案

此问题已在 Matplotlib Githubpandas Github 上讨论。如果你使用 df.plot() 然后为 x 轴设置自定义格式选项(对于日期时间索引的 DataFrame),则会出现此问题。

目前你可以通过手动绘制数据来解决此错误:

manual_plot_workaround.py
for column in df.columns:
    plt.plot(df.index.values, df[column].values, label=column)

但请记住,手动绘制所有内容时,你可能需要自己设置一些 matplotlib 选项(pandas 否则会自动设置)。


Check out similar posts by category: Pandas, Python