如何使用熊猫与每月groupby绘制时间序列?

时间:2019-08-22 03:10:43

标签: python pandas plot time-series

我试图按月分组后绘制一个时间序列,但我在x轴标签上仍获得了几年而不是几个月。如何在不同年份的x轴标签和不同曲线上获得数月?

这是我的尝试:

import numpy as np
import pandas as pd
import statsmodels.api as sm

df = pd.DataFrame.from_records(sm.datasets.co2.load().data)
df['index'] = pd.to_datetime(df['index'])
df = df.set_index('index')

ts = df['co2']['1960':]
ts = ts.bfill()
ts = ts.resample('MS').sum()

ts.groupby(ts.index.month).plot()

想要:

在图的x轴上的月份名称以及不同年份的不同曲线。

该图应类似于以下内容:

2 个答案:

答案 0 :(得分:1)

您可以从以下开始:

ts.groupby([ts.index.month,ts.index.year]).sum().unstack().plot(figsize=(12,8))

更新

import numpy as np
import pandas as pd
import calendar
import seaborn as sns
sns.set(color_codes=True)

import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline


df = pd.read_csv('https://github.com/selva86/datasets/raw/master/AirPassengers.csv',
                 parse_dates=['date'],index_col=['date'])


ts = df['value']

df_plot = ts.groupby([ts.index.month,ts.index.year]).sum().unstack()
df_plot

fig, ax = plt.subplots(figsize=(12,8))
df_plot.plot(ax=ax,legend=False)

# xticks
months = [calendar.month_abbr[i] for i in range(1,13)]
ax.set_xticks(range(12))
ax.set_xticklabels(months)

# plot names in the end
for col in df_plot.columns:
    plt.annotate(col,xy=(plt.xticks()[0][-1]+0.7, df_plot[col].iloc[-1]))

enter image description here

答案 1 :(得分:1)

我认为您正在寻找pandas.to_datetime(),然后使用dattime索引的.month或.year属性。

通过使用statsmodel的'as_pandas = True',您的代码也会变得更短

无论如何,如果您想绘制月份作为色调,我建议在matplotlib上使用seaborn

import pandas as pd
import statsmodels.api as sm
import seaborn as sns

df = sm.datasets.co2.load(as_pandas=True).data
df['month'] = pd.to_datetime(df.index).month
df['year'] = pd.to_datetime(df.index).year
sns.lineplot(x='month',y='co2',hue='year',data=df.query('year>1995')) # filtered over 1995 to make the plot less cluttered

这给

enter image description here