绘制pandas DataFrame对月份

时间:2017-04-28 14:31:08

标签: python pandas datetime matplotlib plot

我需要创建一个行数频率的条形图,按月分组。

问题是水平轴不是正确的时间轴:它错过了没有数据的月份,因此它不是连续的时间轴。

示例代码:

%matplotlib inline
import pandas as pd

d = {'model': 'ep', 
     'date': ('2017-02-02', '2017-02-04', '2017-03-01')}
df1 = pd.DataFrame(d)

d = {'model': 'rs',
     'date': ('2017-01-12', '2017-01-04', '2017-05-01')}
df2 = pd.DataFrame(d)

df = pd.concat([df1, df2])

# Create a column containing the month
df['month'] = pd.to_datetime(df['date']).dt.to_period('M')

# Group by the month and plot
df.groupby('month')['model'].count().plot.bar();

结果条形图缺少月份2017-04。

enter image description here

如何制作大熊猫来绘制所有月份,甚至那些没有数据的大熊猫?

2 个答案:

答案 0 :(得分:2)

您可reindex并传递已构建的PeriodIndex来实现此目的:

df.groupby('month')['model'].count().reindex(pd.PeriodIndex(start=df['month'].sort_values().iloc[0], periods=5)).plot.bar()

enter image description here

由于某种原因,reindex丢失了索引名称,您可以将其恢复:

gp = df.groupby('month')['model'].count()
gp = gp.reindex(pd.PeriodIndex(start=df['month'].sort_values().iloc[0], periods=5))
gp.index.name = 'month'
gp.plot.bar()

得到情节:

enter image description here

答案 1 :(得分:2)

为了记录,我使用了这段代码:

%matplotlib inline
import pandas as pd

d = {'model': 'ep', 
     'date': ('2017-02-02', '2017-02-04', '2017-03-01')}
df1 = pd.DataFrame(d)

d = {'model': 'rs',
     'date': ('2017-01-12', '2017-01-04', '2017-05-01')}
df2 = pd.DataFrame(d)

df = pd.concat([df1, df2])

# Create a column containing the month
df['month'] = pd.to_datetime(df['date']).dt.to_period('M')

# Get the start and end months
months = df['month'].sort_values()
start_month = months.iloc[0]
end_month = months.iloc[-1]

index = pd.PeriodIndex(start=start_month, end=end_month)

df.groupby('month')['model'].count().reindex(index).plot.bar();

这给出了这个情节:

enter image description here

感谢EdChum