如何仅使用我df中的日期而不是所有日期进行绘图

问题描述

我有以下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()

我还添加了网格。

结果是:

enter image description here

最后一点:避免使用与现有列名称相同的列名 Pandas 方法或属性(例如 values )。 有时,这是“愚蠢”错误的原因(您打算参考 一列,但实际上是指方法或属性。