在Seaborn情节中重叠不同年份的熊猫时间序列

时间:2017-06-22 16:39:53

标签: python date pandas time-series seaborn

我有一个Pandas数据框,我想探索时间序列的周期性,趋势等。 Here是数据。

为了使其可视化,我想在同一个图上叠加每年的“子时间序列”(即对于01/01 / 2000,01 / 01/2001和01/01 /的数据具有相同的x坐标2002)。

我是否必须转换我的日期列,以便每个数据都具有相同的年份?

有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

<强>设置
解析您链接的数据

df = pd.read_csv(
    'data.csv', sep=';', decimal=',',
    usecols=['date', 'speed', 'height', 'width'],
    index_col=0,  parse_dates=[0]
)

我的黑客
我剥离了除日期之外的所有内容,并假设2012年,因为它是闰年,将适应2月29日。我将年份分成多指数的另一个级别unstackplot

idx = pd.MultiIndex.from_arrays([
        pd.to_datetime(df.index.strftime('2012-%m-%d %H:%M:%S')),
        df.index.year
    ])

ax = df.set_index(idx).unstack().speed.plot()
lg = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, ncol=2)

enter image description here

努力实现这一目标

fig, axes = plt.subplots(3, 1, figsize=(15, 9))

idx = pd.MultiIndex.from_arrays([
        pd.to_datetime(df.index.strftime('2012-%m-%d %H:%M:%S')),
        df.index.year
    ])

d1 = df.set_index(idx).unstack().resample('W').mean()
d1.speed.plot(ax=axes[0], title='speed')
lg = axes[0].legend(bbox_to_anchor=(1.02, 1), loc=2, ncol=1)

d1.height.plot(ax=axes[1], title='height', legend=False)
d1.width.plot(ax=axes[2], title='width', legend=False)

fig.tight_layout()

enter image description here

答案 1 :(得分:1)

你可以做到的一种方法是为所有年份创建一个通用的x轴:

df['yeartime']=df.groupby(df.date.dt.year).cumcount()

其中'yeartime'表示一年中的时间测量数。接下来,创建年份列:

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

现在,让我们对2000年,2001年和2002年1月1日的数据进行子集化

subset_df = df.loc[df.date.dt.year.isin(['2000','2001',2002]) & (df.date.dt.day == 1) & (df.date.dt.month == 1)]

最后,绘制它。

ax = sns.pointplot('yeartime','speed',hue='year',data=subset_df, markers='None')
_ =ax.get_xaxis().set_ticks([])

enter image description here