我有一个Pandas数据框,我想探索时间序列的周期性,趋势等。 Here是数据。
为了使其可视化,我想在同一个图上叠加每年的“子时间序列”(即对于01/01 / 2000,01 / 01/2001和01/01 /的数据具有相同的x坐标2002)。
我是否必须转换我的日期列,以便每个数据都具有相同的年份?
有没有人知道如何做到这一点?
答案 0 :(得分:2)
<强>设置强>
解析您链接的数据
df = pd.read_csv(
'data.csv', sep=';', decimal=',',
usecols=['date', 'speed', 'height', 'width'],
index_col=0, parse_dates=[0]
)
我的黑客
我剥离了除日期之外的所有内容,并假设2012
年,因为它是闰年,将适应2月29日。我将年份分成多指数的另一个级别unstack
和plot
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)
努力实现这一目标
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()
答案 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([])