Error DateFormatter found a value of x=0, 这是 matplotlib 条形图中的非法日期

Error DateFormatter found a value of x=0, which is an illegal date in matplotlib bar plot

我正在尝试在 matplotlib 中绘制双条形图,其中 x 轴是日期值。 我的数据框如下:

+------------+----------+----------+
|            | Column A | Column B |
+------------+----------+----------+
| 2020-03-28 |        4 |      0.0 |
+------------+----------+----------+
| 2020-03-29 |      250 |     58.0 |
+------------+----------+----------+
| 2020-03-30 |       72 |     10.0 |
+------------+----------+----------+
| 2020-03-31 |       10 |      0.0 |
+------------+----------+----------+
| 2020-04-01 |        7 |      0.0 |
+------------+----------+----------+
|        ... |      ... |      ... |
+------------+----------+----------+
| 2020-05-12 |        6 |      0.0 |
+------------+----------+----------+
| 2020-05-13 |        2 |      0.0 |
+------------+----------+----------+
| 2020-05-14 |        9 |      0.0 |
+------------+----------+----------+
| 2020-05-15 |        5 |      0.0 |
+------------+----------+----------+
| 2020-05-16 |       35 |      1.0 |
+------------+----------+----------+

我想用条形图绘制它,代码如下:

g.plot.bar()
ax = plt.gca()
ax.set_yscale('log')
ax.xaxis_date() 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))

最后一行是为 x 轴上的刻度设置格式化程序,因为如果没有,它将显示整个月中的所有日期。当我尝试这样做时,它引发了以下异常:

ValueError: DateFormatter found a value of x=0, which is an illegal date; this usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()

我已经搜索了很多这个错误,但我无法弄清楚 code/data...

出了什么问题

据说 pandas 不能很好地处理自定义日期格式。
所以我们可以改用base matplotlib。
这个其他的答案对我有帮助:

import matplotlib.pyplot as plt, numpy as np, matplotlib.dates as mdates 

x = mdates.datestr2num(g.index.strftime('%m-%d')) 
w = 0.25
fig = plt.figure(figsize=(8, 4)) 
ax = fig.add_subplot(111) 
ax.bar(x - w, g['Column A'], width=2 * w, align='center') 
ax.bar(x + w, g['Column B'], width=2 * w, align='center') 
ax.xaxis_date() 
ax.xaxis.set_major_locator(mdates.AutoDateLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d"))
plt.show()

结果: