python - 如何仅使用我的 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 中的日期绘制图表?
解决方案
我假设日期列是日期时间类型。
要仅针对选定日期进行绘制,索引必须建立在“唯一列表中的天数+小时”的原则上。
但是要抑制默认的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)。有时它是“愚蠢”错误的原因(您打算引用列,但实际上引用的是方法或属性)。
推荐阅读
- laravel - Laravel Redhat,找不到网址
- html - 如何创建带有国家代码的自定义手机号码输入框 - HTML
- spring-security - 无法获取刷新令牌并取回响应
- javascript - 如何像这样转换对象Javascript?
- python - 授予角色时缺少权限错误
- command-prompt - 在命令提示符下打开 Microsoft Office Word
- excel - 计算过滤列中与字符串匹配的单元格数不起作用
- bash - 在我编辑我的 .bashrc 之后,有没有比 `source ~/.bashrc` 更好的方法?
- javascript - 如何在身份验证之前防止我的页面呈现
- windows - 来自守护进程的错误响应:从 openzim/zim-tools 的 Docker 映像运行命令时容器未运行