问题描述
我有以下df:
date values
2020-08-06 08:00:00 5
2020-08-06 09:00:00 10
2020-08-06 10:00:00 0
2020-08-17 08:00:00 8
2020-08-17 09:00:00 15
我想绘制此df,所以我做了:df.set_index('date')['values'].plot(kind='line')
,但它显示了6日到17日之间的所有日期。
如何仅在df中包含日期的情况下绘制图形?
解决方法
我认为 date 列是 datetime 类型。
要仅 绘制选定的日期,索引必须建立在 原则“唯一列表中的天数+小时”。
但是要取消默认的 x 标签刻度,您必须定义 您自己的,例如每个日期中的每个8小时。
从如下所述开始转换DataFrame:
idx = df['date'].dt.normalize().unique()
dateMap = pd.Series(np.arange(idx.size) * 24,index=idx)
df.set_index(df.date.dt.date.map(dateMap) + df.date.dt.hour,inplace=True)
df.index.rename('HourNo',inplace=True); df
现在,对于您的数据样本,它具有以下内容:
date values
HourNo
8 2020-08-06 08:00:00 5
9 2020-08-06 09:00:00 10
10 2020-08-06 10:00:00 0
32 2020-08-17 08:00:00 8
33 2020-08-17 09:00:00 15
然后生成您的情节,并 x 标记位置和标签:
fig,ax = plt.subplots(tight_layout=True)
df.loc[:,'values'].plot(style='o-',rot=30,ax=ax)
xLoc = np.arange(0,dateMap.index.size * 24,8)
xLbl = pd.concat([ pd.Series(d + pd.timedelta_range(start=0,freq='8H',periods=3)) for d in dateMap.index ]).dt.strftime('%Y-%m-%d\n%H:%M')
plt.xticks(ticks=xLoc,labels=xLbl,ha='right')
ax.set_xlabel('Date')
ax.set_ylabel('Value')
ax.set_title('Set the proper heading')
ax.grid()
plt.show()
我还添加了网格。
结果是:
最后一点:避免使用与现有列名称相同的列名 Pandas 方法或属性(例如 values )。 有时,这是“愚蠢”错误的原因(您打算参考 一列,但实际上是指方法或属性。