Matplotlib 似乎误解了 Pandas datetime64[ns] 索引。我的 MVCE 显示一些当前日期被解释为 1970 年。是否根本无法将mpl.dates格式化程序与 pandas 日期一起使用? ax.get_figure().autofmt_xdate()工作正常,但返回整个详细日期字符串。
import pandas as pd
import matplotlib as mpl
from pandas import Timestamp
print(f"pd:{pd.__version__} mpl:{mpl.__version__}")
df = pd.DataFrame({'Hourly Total':
{Timestamp('2022-04-28 11:00:00-0700', tz='Canada/Pacific'): 0.0012916667166666667,
Timestamp('2022-04-28 12:00:00-0700', tz='Canada/Pacific'): 0.00383333365,
Timestamp('2022-04-28 13:00:00-0700', tz='Canada/Pacific'): 0.00383333365,
Timestamp('2022-04-28 14:00:00-0700', tz='Canada/Pacific'): 0.00383333365},
})
ax = df.plot(kind='bar')
formatter = mpl.dates.DateFormatter('%y-%m-%d')
ax.xaxis.set_major_formatter(formatter)
Run Code Online (Sandbox Code Playgroud)
这是 Pandas 条形图绘制功能的问题。如果将 更改DateFormatter为 aStrMethodFormatter以检查传递的值,您可以看到它只接收您正在绘制的条形的标量索引(从 0 开始):
# Here 'x' is the value used to format the tick labels.
ax.xaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x} {pos}'))
Run Code Online (Sandbox Code Playgroud)
这表明:
因此,DateFormatter尝试将 0、1、2 和 3 转换为日期,这给出了 Epoch 1970-1-1 UTC。不幸的是,使用 提供的默认格式化程序没有简单的方法matplotlib,因为它们总是会收到错误的数据。
解决方案 1
正如您的评论所建议的,一种解决方案是简单地手动更改xticklabels。
ax.set_xticklabels(df.index.strftime("%Y-%m-%d"))
Run Code Online (Sandbox Code Playgroud)
解决方案 2
使用 matplotlib 而不是 Pandas 进行绘图。在这种情况下,还要注意DateFormatter忽略日期的时区:
import matplotlib.pyplot as pet
import pytz
f, ax = plt.subplots()
ax.bar(df.index, df['Hourly Total'], width=0.03)
# Notice here we do need the timezone.
ax.xaxis.set_major_locator(mpl.dates.HourLocator(interval=1, tz=pytz.timezone('Canada/Pacific')))
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%y-%m-%d %H:%M', tz=pytz.timezone('Canada/Pacific')))
f.autofmt_xdate()
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |