如何手动选择在pandas

时间:2017-10-30 13:45:42

标签: 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','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')

This is the plot

正如您所看到的情节,将2010-08,2013-09,2014-07作为x轴值。我该如何制作类似2010-01,2013-01,2014-01 e.t.c

的内容

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

1 个答案:

答案 0 :(得分:1)

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

您正在使用matplotlibaxes以及ax1方法和plt混合Pandas绘图以及matplotlib PyPlot APIObject-oriented API方法。后者是两种截然不同的API,它们在混合时可能无法正常工作。 matplotlib.pyplot文档建议使用面向对象的API。

  

虽然使用matplotlib.axes.Axes()模块快速生成绘图很容易,但我们建议使用面向对象的方法来更好地控制和自定义绘图。有关许多相同的绘图函数,请参阅matplotlib类中的方法。有关Matplotlib的OO方法的示例,请参阅API示例。

以下是使用面向对象的API使用正确的matplotlib日期格式(see matplotlib example)控制x轴“tick”值/标签的方法。另请参阅@ImportanceOfBeingErnest answer to another question中的链接,了解Pandas和datetime # 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') 个对象之间的不兼容性。

class rectangle : shape
{
  public int length { get; set; }
  public int width { get; set; }

  public override void Draw(Graphics g)
  {
    g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width,length));
   }
 }