为什么我的pandas.plot一年的时间总是显示以9结尾的年份?

为什么我的pandas.plot一年的时间总是显示以9结尾的年份?

问题描述:

我使用熊猫内置的.plot命令来绘制一些长时间序列的东西。为什么我的pandas.plot一年的时间总是显示以9结尾的年份?

但是我的日期标记总是默认情况下以9结尾的年份。 screenshot of plot

这是为什么,我该如何改变它?以0结尾的年份看起来好多了。

试图设置轴的窗口为plt.xlim('1966', '2013')或类似的东西也不会做任何关于阴谋恋物癖多年的结尾9(和4,如果你“放大”,如上所示)。

它似乎与源数据框中的日期的开始和结束没有任何关系。

这里是一个最小的,空的,例如:

dfdates = pd.date_range('01/01/1942', '01/01/2018', freq = 'MS') 
dfzeros = np.zeros((len(dfdates))) 
header_test = pd.MultiIndex.from_product([['zero'],['zero'], ['zero'], ['zero'], ['zero'], ['zero']], names = ['stuff1', 'stuff2', 'stuff3', 'stuff4', 'stuff5', 'stuff6']) 
Big_df = pd.DataFrame(dfzeros, index = dfdates, columns = header_test) 

Big_df.plot() 
plt.show() 

...而这将导致这对我来说: empty test plot

,我不能在最后改变9的,不管我设置了一个与plt.xlim的窗口,或者如果我更改了dfdates的开始和结束年份,几个月或几天,所以它不像“开始数据框+ 10年”或类似的那样简单,而且我的大标题也不会影响这些。

我大概可以每手设置更明智的剔骨,但我更想知道为什么它最终想用9年的时间。

编辑 因此,这里是我的情节,用@ lanery的答案会发生什么: plot with double ticks 注意在我指定的自定义蜱的小区面积的双蜱(1965年时开始)。 我的所有数据框始于1940年,但许多数据框都是空的,到某个地方我开始获取数据,具体取决于所讨论的数据集。我可以用plt.xlim('1965','2015')将它关闭,但我把它放在这个图中,以显示发生了什么。

由于设置plt.xlimdatetime对象,像

plt.xlim(pd.datetime(1966, 1, 1), pd.datetime(2013, 1, 1)) 

没有做的伎俩,我认为最好的行动当然是设置自定义xticksxticklabels。这可以这样做,像这样

dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5)) 
ax.xaxis.set_ticks(dates) 
ax.xaxis.set_ticklabels(dates.strftime('%Y')) 

一些随机数据完整的例子:

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

np.random.seed(17) 
years = pd.date_range(pd.datetime(1990, 1, 1), pd.datetime(2015, 1, 1), freq='MS') 
random_data = np.asarray(np.split(np.cumsum(np.random.randn(years.size*3)), 3)).T 
df = pd.DataFrame(random_data, columns=['A', 'B', 'C'], index=years) 

# all of the relevant plotting and xtick formatting 
fig = plt.figure() 
ax = fig.add_subplot(111) 

df.plot(ax=ax) 

# select range of years for the x-axis as well as major tick spacing 
dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5)) 
ax.xaxis.set_ticks(dates) 
ax.xaxis.set_ticklabels(dates.strftime('%Y')) 
# dates.strftime('%Y') = (['1990', '1995',...,'2010', '2015']) 

ax.grid() 

enter image description here

+0

它的工作与我的例子,但与真实的数据,它才不是。 (或者实际上,它确实没有错误,窗口移动,但9号停留)。 –

+0

'熊猫'阴谋更多地强调自动格式化的情节,所以我希望设置'xlim'将是一个简单的方法来重新调整自动选择的主要tickmarks(尤其是在你的例子)。由于它没有,你可能需要重写一些定制,也许这个例子将有助于:http:// *。com/questions/3486121/how-to-plot-data-against-specific-dates-on-the-x-axis-using-matplotlib – lanery

+0

@JC_CL我更新了我的答案,以显示如何设置自定义的“xticks”和“xticklabels '。它基本上只有3行,所以希望将这个解决方案应用到你的数据框应该是相对无痛的(也就是说,如果你还没有找到解决方法)。 – lanery