我有一个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)')
我得到的散点图如下图所示。
由于有很多点难以辨别平均趋势,我想计算每周的平均销售价格,并在同一情节中绘制。我尝试了以下内容:
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)')
我可以更清楚地看出增长趋势(见下文)。
问题在于我不再有时间轴将此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指数,我可以将每周平均数据绘制成一个?
答案 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)
得出下图。