pandas 如何将月份和年份的数据绘制成条形图?

v8wbuo2f  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(81)

我有这样的数据,我想用matplotlib按月和年绘制。

df = pd.DataFrame({'date':['2018-10-01', '2018-10-05', '2018-10-20','2018-10-21','2018-12-06',
                            '2018-12-16', '2018-12-27', '2019-01-08','2019-01-10','2019-01-11',
                            '2019-01-12', '2019-01-13', '2019-01-25', '2019-02-01','2019-02-25', 
                            '2019-04-05','2019-05-05','2018-05-07','2019-05-09','2019-05-10'],
                  'counts':[10,5,6,1,2,
                            5,7,20,30,8,
                            9,1,10,12,50,
                            8,3,10,40,4]})

首先,我转换了日期时间格式,并从每个日期中获取年份和月份。

df['date'] = pd.to_datetime(df['date'])

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

然后,我试着这样做groupby。

aggmonth = df.groupby(['year', 'month']).sum()

我想用条形图或类似的东西把它形象化。但是正如你上面注意到的,数据之间有缺失的月份。我希望那些缺失的月份都是0。我不知道在这样的数据框里怎么做。以前,我问this question about filling missing dates in a period of data.在哪里将日期转换为月-年格式的期间范围。

by_month = pd.to_datetime(df['date']).dt.to_period('M').value_counts().sort_index()
by_month.index = pd.PeriodIndex(by_month.index)

df_month = by_month.rename_axis('month').reset_index(name='counts')
df_month

idx = pd.period_range(df_month['month'].min(), df_month['month'].max(), freq='M')
s = df_month.set_index('month').reindex(idx, fill_value=0)
s

但是当我尝试使用matplotlib绘制s时,它返回了一个错误。事实证明,您无法使用matplotlib绘制周期数据。
所以基本上我脑子里有这两个想法,但都卡住了,我不知道我应该继续追求哪一个才能得到我想要的结果。
最好的方法是什么?谢谢.

yjghlzjz

yjghlzjz1#

date列转换为pandas datetime序列,然后在每月period上使用groupby并使用sum聚合数据,然后在聚合的 Dataframe 上使用DataFrame.resample以每月频率重新采样:

df['date'] = pd.to_datetime(df['date'])
df1 = df.groupby(df['date'].dt.to_period('M')).sum()
df1 = df1.resample('M').asfreq().fillna(0)

绘制数据:

df1.plot(kind='bar')

相关问题