Python 如何手动选择在熊猫中绘制的x轴标签(日期)

Python 如何手动选择在熊猫中绘制的x轴标签(日期),python,pandas,datetime,matplotlib,plot,Python,Pandas,Datetime,Matplotlib,Plot,首先,如果我没有正确地描述问题,我很抱歉,但是这个例子应该让我的问题清楚 我有这个数据框,我需要按日期排序绘制它,但我有很多日期(大约60个),因此熊猫会自动选择在x轴上绘制(标记)哪个日期,并且日期是随机的。由于可见性问题,我也只想在x轴上绘制选定的日期,但我希望它有一些模式,比如每年的1月 这是我的代码: df = pd.read_csv('dbo.Access_Stat_all.csv',error_bad_lines=False, usecols=['Range_Start','Form

首先,如果我没有正确地描述问题,我很抱歉,但是这个例子应该让我的问题清楚

我有这个数据框,我需要按日期排序绘制它,但我有很多日期(大约60个),因此熊猫会自动选择在x轴上绘制(标记)哪个日期,并且日期是随机的。由于可见性问题,我也只想在x轴上绘制选定的日期,但我希望它有一些模式,比如每年的1月

这是我的代码:

df = pd.read_csv('dbo.Access_Stat_all.csv',error_bad_lines=False, usecols=['Range_Start','Format','Resource_ID','Number'])
df1 = df[df['Resource_ID'] == 32543]
df1 = df1[['Format','Range_Start','Number']]
df1["Range_Start"] = df1["Range_Start"].str[:7]
df1 = df1.groupby(['Format','Range_Start'], as_index=True).last()
pd.options.display.float_format = '{:,.0f}'.format
df1 = df1.unstack()
df1.columns = df1.columns.droplevel()
if df1.index.contains('entry'):
    df2 = df1[1:4].sum(axis=0)
else:
    df2 = df1[0:3].sum(axis=0)
df2.name = 'sum'
df2 = df1.append(df2)
print(df2)
df2.to_csv('test.csv', sep="\t", float_format='%.f')
if df2.index.contains('entry'):
    df2.T[['entry','sum']].plot(rot = 30)
else:
    df2.T[['sum']].plot(kind = 'bar')
ax1 = plt.axes()
ax1.legend(["Seitenzugriffe", "Dateiabrufe"])
plt.xlabel("")
plt.savefig('image.png')

如您所见,该图的x轴值为2010-08、2013-09、2014-07。我怎样才能做到像2010-012013-012014-01E.t.c


非常感谢,我知道这不是最好的描述,但由于英语不是我的第一语言,这是我能想到的最好的描述。

注意:更新以更直接地回答OP问题。

您正在混合打印和
matplotlib
以及使用
ax1
以上)方法和
plt
方法。后者是两种截然不同的API,混合使用时可能无法正常工作。
matplotlib
文档建议使用面向对象的API

虽然使用
matplotlib.pyplot
模块可以轻松快速生成绘图,但我们建议使用面向对象的方法对绘图进行更多的控制和自定义。有关许多相同的打印函数,请参见
matplotlib.axes.axes()
类中的方法。有关Matplotlib的OO方法示例,请参见API示例

以下是如何使用适当的
matplotlib
date格式化()和面向对象的API来控制x轴“勾号”值/标签。另外,请参见中的链接,以了解Pandas对象和
matplotlib
对象之间的不兼容性

# prepare your data
df = pd.read_csv('../../../so/dbo.Access_Stat_all.csv',error_bad_lines=False, usecols=['Range_Start','Format','Resource_ID','Number'])
df.head()
df1 = df[df['Resource_ID'] == 10021]
df1 = df1[['Format','Range_Start','Number']]
df1["Range_Start"] = df1["Range_Start"].str[:7]
df1 = df1.groupby(['Format','Range_Start'], as_index=True).last()
pd.options.display.float_format = '{:,.0f}'.format
df1 = df1.unstack()
df1.columns = df1.columns.droplevel()
if df1.index.contains('entry'):
    df2 = df1[1:4].sum(axis=0)
else:
    df2 = df1[0:3].sum(axis=0)
df2.name = 'sum'
df2 = df1.append(df2)
print(df2)
df2.to_csv('test.csv', sep="\t", float_format='%.f')
if df2.index.contains('entry'):
    # convert your index to use pandas datetime format
    df3 = df2.T[['entry','sum']].copy()
    df3.index = pd.to_datetime(df3.index)
    # for illustration, I changed a couple dates and added some dummy values
    df3.loc['2014-01-01']['entry'] = 48
    df3.loc['2014-05-01']['entry'] = 28
    df3.loc['2015-05-01']['entry'] = 36
    print(df3)

    # plot your data
    fig, ax = plt.subplots()

    # use matplotlib date formatters
    years = mdates.YearLocator()   # every year
    yearsFmt = mdates.DateFormatter('%Y-%m')

    # format the major ticks
    ax.xaxis.set_major_locator(years)
    ax.xaxis.set_major_formatter(yearsFmt)

    ax.plot(df3)

    # add legend
    ax.legend(["Seitenzugriffe", "Dateiabrufe"])

    fig.savefig('image.png')
else:
    # left as an exercise...
    df2.T[['sum']].plot(kind = 'bar')

为了完全控制xaxis上的日期时间格式,需要使用matplotlib日期定位器和格式设置程序。由于不能在通过pandas创建的轴上使用它们,因此从一开始就使用matplotlib将是最佳选择。参见例如axes.plot(df2.T[['entry','sum']])抛出以下错误:ValueError:无法将字符串转换为浮点:“2017-06'@Uttam您可以提供一些样本数据进行测试吗?访问统计ID、资源ID、范围开始、范围结束、名称、格式、编号、匹配的URL 689085910020、“2014-05-01 00:00:00”、“2014-05-31 23:59:59”、“2014年5月”、“html”89、,“/Disertationen/biologie/behrend anke/HTML/behrend vita.HTML”689086010021,“2014-05-01 00:00:00”,“2014-05-31 23:59:59”,“2014年5月”,“pdf”,30“/Disertationen/biologie/dreier lars/pdf/dreier.pdf”689086110021,“2014-05-01 00:00:00”,“2014-05-31 23:59:59”,“2014年5月”,“条目”,2“?“689086210021”,“2014-05-01 00:00:00”,“2014-05-05-31:59”,“2014年5月”html“,11,“/disertationen/biologie/dreier-lars/html/chapter4.html”