pandas棒图更改date格式

我有一个简单的堆积线图,具有完全使用下面的代码时,我想魔法设置的date格式。

df_ts = df.resample("W", how='max') df_ts.plot(figsize=(12,8), stacked=True) 

在这里输入图像描述

然而,当将相同的数据作为条形图绘制时,这些date神秘地将其自身转换成丑陋且不可读的格式。

 df_ts = df.resample("W", how='max') df_ts.plot(kind='bar', figsize=(12,8), stacked=True) 

在这里输入图像描述

原始数据被转换了一点,以每周最大。 为什么在自动设置date发生这种根本性的变化? 我如何能有上面很好格式化的date?

这是一些虚拟数据

 start = pd.to_datetime("1-1-2012") idx = pd.date_range(start, periods= 365).tolist() df=pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)}) df.index = idx df_ts = df.resample('W', how= 'max') df_ts.plot(kind='bar', stacked=True) 

绘图代码假定条形图中的每个条应该有自己的标签。 你可以通过指定你自己的格式化程序来覆盖这个假设:

 ax.xaxis.set_major_formatter(formatter) 

pandas.tseries.converter.TimeSeries_DateFormatter用于格式化“良好”情节中的date的pandas.tseries.converter.TimeSeries_DateFormatter当x值是date时与线图很好地配合使用。 但是,通过条形图 ,x值(至less是TimeSeries_DateFormatter.__call__接收到的值)只是从零开始的整数。 如果您尝试将TimeSeries_DateFormatter与条形图一起使用,则所有的标签都将从1970年1月1日UTC开始,因为这是对应于零的date。 所以用于线图的格式化程序不幸对条形图没有用处(至less据我所知)。

我看到生成所需格式的最简单方法是显式生成和设置标签:

 import numpy as np import matplotlib.pyplot as plt import pandas as pd import matplotlib.ticker as ticker start = pd.to_datetime("5-1-2012") idx = pd.date_range(start, periods= 365) df = pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)}) df.index = idx df_ts = df.resample('W', how= 'max') ax = df_ts.plot(kind='bar', x=df_ts.index, stacked=True) # Make most of the ticklabels empty so the labels don't get too crowded ticklabels = ['']*len(df_ts.index) # Every 4th ticklable shows the month and day ticklabels[::4] = [item.strftime('%b %d') for item in df_ts.index[::4]] # Every 12th ticklabel includes the year ticklabels[::12] = [item.strftime('%b %d\n%Y') for item in df_ts.index[::12]] ax.xaxis.set_major_formatter(ticker.FixedFormatter(ticklabels)) plt.gcf().autofmt_xdate() plt.show() 

产量 在这里输入图像描述