首页 > 解决方案 > 如何仅使用我的 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 中的日期绘制图表?

标签: pythonpandasdatetime

解决方案


我假设日期列是日期时间类型。

要仅针对选定日期进行绘制,索引必须建立在“唯一列表中的天数+小时”的原则上。

但是要抑制默认的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方法或 arrtibutes相同的列名 (例如values)。有时它是“愚蠢”错误的原因(您打算引用列,但实际上引用的是方法或属性)。


推荐阅读