在Pandas中,从Multi-Index生成DateTime索引,包含数年和数周

时间:2016-07-19 15:03:42

标签: python datetime pandas

我有一个DataFrame df,列saledate(在DateTime,dytpe <M8[ns])和price(dytpe int64),如果我绘制它们像

fig, ax = plt.subplots()
ax.plot_date(dfp['saledate'],dfp['price']/1000.0,'.')
ax.set_xlabel('Date of sale')
ax.set_ylabel('Price (1,000 euros)')

我得到的散点图如下图所示。

enter image description here

由于有很多点难以辨别平均趋势,我想计算每周的平均销售价格,并在同一情节中绘制。我尝试了以下内容:

dfp_week = dfp.groupby([dfp['saledate'].dt.year, dfp['saledate'].dt.week]).mean()

如果我按照这样的方式绘制结果'价格'列

plt.figure()
plt.plot(df_week['price'].values/1000.0)
plt.ylabel('Price (1,000 euros)')

我可以更清楚地看出增长趋势(见下文)。

enter image description here

问题在于我不再有时间轴将此DataSeries绘制在与上图相同的图中。时间轴如下所示:

                   longitude_4pp  postal_code_4pp     price  rooms  \
saledate saledate                                                    
2014     1              4.873140           1067.5  206250.0    2.5   
         6              4.954779           1102.0  129000.0    3.0   
         26             4.938828           1019.0  327500.0    3.0   
         40             4.896904           1073.0  249000.0    2.0   
         43             4.938828           1019.0  549000.0    5.0 

我怎样才能将这个多指数用数年和数周转换回单个DateTime指数,我可以将每周平均数据绘制成一个?

3 个答案:

答案 0 :(得分:1)

创建新索引:

i = pd.Index(pd.datetime(year, 1, 1) + pd.Timedelta(7 * weeks, unit='d') for year, weeks in df.index)

然后在DataFrame上设置这个新索引:

df.index = i

答案 1 :(得分:1)

如果您使用pd.TimeGrouper进行分组,则会在索引中保留日期时间。

dfp.groupby(pd.TimeGrouper('W')).mean()

答案 2 :(得分:1)

为了完整起见,以下是我如何实施piRSquared建议的解决方案的详细信息:

fig, ax = plt.subplots()
ax.plot_date(dfp['saledate'],dfp['price']/1000.0,'.')
ax.set_xlabel('Date of sale')
ax.set_ylabel('Price (1,000 euros)')

dfp_week = dfp.groupby(pd.TimeGrouper(key='saledate', freq='W')).mean()
plt.plot_date(dfp_week.index, dfp_week['price']/1000.0)

得出下图。

enter image description here