Python 熊猫+;matplotlib:更改日期刻度格式

Python 熊猫+;matplotlib:更改日期刻度格式,python,pandas,datetime,matplotlib,Python,Pandas,Datetime,Matplotlib,Pandas具有方便的Pandas.DataFrame.plot功能,可使用Matplotlib绘制数据框的所有列。我经常发现自己在使用DatetimeIndex,因此生成的图共享相同的DateTimeX轴。但是,我还经常希望使用Matplotlib DateFormatter格式化结果图上的刻度标签。但这似乎是不可能的 要显示我的问题,请使用一个小示例代码: import matplotlib.dates as dates import matplotlib.pyplot as plt imp

Pandas具有方便的Pandas.DataFrame.plot功能,可使用Matplotlib绘制数据框的所有列。我经常发现自己在使用DatetimeIndex,因此生成的图共享相同的DateTimeX轴。但是,我还经常希望使用Matplotlib DateFormatter格式化结果图上的刻度标签。但这似乎是不可能的

要显示我的问题,请使用一个小示例代码:

import matplotlib.dates as dates
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


fig, ax = plt.subplots(nrows=3, figsize=(8, 11))
# Create DataFrame with random data
df = pd.DataFrame({"foo": np.random.random(100), "bar": np.random.random(100)},
                  index=pd.date_range("2020-01-01", freq="D", periods=100))

# First method
df.plot(ax=ax[0])
ax[0].set_title("df.plot()")

# Second method
df.plot(ax=ax[1])
ax[1].xaxis.set_major_formatter(dates.DateFormatter("%Y-%m-%d"))
ax[1].set_title('ax = df.plot(); ax.xaxis.set_major_formatter(dates.DateFormatter("%Y-%m-%d"))')

# Third method
ax[2].plot_date(df.index, df["foo"].values, fmt="-", label="foo")
ax[2].plot_date(df.index, df["bar"].values, fmt="-", label="bar")
pd.DatetimeIndex
ax[2].xaxis.set_major_formatter(dates.DateFormatter("%Y-%m-%d"))
ax[2].set_title('ax.plot_date(df.index, df["foo"]); ax.plot_date(df.index, df["bar"])\nax.xaxis.set_major_formatter(dates.DateFormatter("%Y-%m-%d"))')
ax[2].legend()

# Rotate ticklabels in all plots
for ax in fig.get_axes():
    ax.tick_params(rotation=45)
plt.tight_layout()
结果如下图所示:

如您所见,第一个绘图上的小刻度位置并不完美,但日期符号至少是正确的

在第二个绘图中,我尝试使用matplotlib DateFormatter对日期的实际显示方式进行更多的控制,但指出的日期完全错误。此外,使用%y而不是%y将在我的Windows计算机上引发错误,因为年份必须大于1900

在第三个绘图中,我跳过了Pandas内置的绘图功能,直接使用Matplotlib,使用完全相同的技术格式化日期刻度标签。这正是我想要它做的,以我自己定义的方式显示正确的日期

我还尝试过使用pandas.DatetimeIndex.to_pydatetime和pandas.Timestamp的to_pydatetime、to_datetime64、to_numpy和to_julian_date函数将数据帧的索引转换为各种日期时间,但没有成功

是否有可能控制用户如何标记DatetimeIndex的datetime值?还是我一直坚持使用Matplotlib手动创建绘图


基本上:我可以使用pd.DataFrame.plot()而不是plt.plot_date()获得第三个绘图的结果吗?

df.plot
只是绘制数据帧的一个方便函数。它返回一个
Axes
对象,您可以根据自己的意愿修改它:
ax[0].xaxis.set\u major\u formatter(dates.DateFormatter(“%Y-%m-%d”)
您到底想问什么还不太清楚@CodeDifferent正如您在我的示例中所看到的,这不起作用…
df.plot
只是一个绘制数据帧的方便函数。它返回一个
Axes
对象,您可以根据自己的意愿修改它:
ax[0].xaxis.set\u major\u formatter(dates.DateFormatter(“%Y-%m-%d”)
您到底想问什么还不太清楚@正如你在我的例子中看到的,代码不同,这不起作用。。。