首页 > 解决方案 > 如何从 Python 中的日期时间戳中提取小时:分钟

问题描述

我有如下给出的数据框:df=

                          POA                ...          Inverter efficiency
2019-01-25 08:00:00    20.608713         ...                      0.708626
2019-01-29 08:00:00   200.250137         ...                      0.017787
2019-01-29 08:30:00   347.699615         ...                      0.000000
2019-01-29 09:00:00   492.822662         ...                      0.000000
2019-01-29 09:30:00   620.336243         ...    
.
.                 
2019-03-07 13:00:00  1151.468384         ...                      1.067493
2019-03-07 13:30:00  1119.876831         ...                      2.311577
2019-03-07 14:00:00  1038.760864         ...                      3.395081

我想为所有天绘制 24 小时图。我的代码

plot(df.index.hour,df['POA'])

结果是:

全天每小时数据

但是,在08:30、09:30、...等时有数据。但它没有反映在情节中。实际上,这些中间小时数据点是与 08、09hr 等数据结合在一起的。所以,我的问题是,如何在绘图上同时显示 08.30、09.30、...等数据?(看起来我必须从同一日期时间提取小时和分钟)

我接受的以下答案给出了以下情节,这就是我想要的。但是,x 轴刻度是结合在一起的。它们不像我上面的第一个情节那样出现。如何在我的第二个图中更正 x 轴刻度?:'

在此处输入图像描述

标签: pythonpython-3.xmatplotlibpython-datetime

解决方案


#rng = pd.date_range('1/5/2018 00:00', periods=5, freq='35T')
#df = pd.DataFrame({'POA':randint(1, 10, 5)}, index=rng)
labels = df.index.strftime('%H:%M')
x = np.arange(len(labels))
plt.plot(x, df['POA'])
plt.xticks(x, labels)

脚步:

  • labels = df.index.strftime('%H:%M')=> 将日期时间转换为“小时:分钟”格式以用作 x 标签
  • x = np.arange(len(labels))=> 为 matplotlib 创建一个虚拟 x 轴
  • plt.plot(x, df['POA'])=> 制作情节
  • plt.xticks(x, labels)=> 用日期时间替换 x 标签

假设:日期时间索引已排序,否则图表将被弄乱。如果索引未按排序顺序,则在绘制正确结果之前对其进行排序。

我们可以通过在 df.index.strftime 中使用适当的字符串格式化程序来进一步增强 x 轴以包含秒、日期等

跳过 x-ticks 的解决方案以避免出现棒状 x 标签

#rng = pd.date_range('1/5/2018 00:00', periods=50, freq='35T')
#df = pd.DataFrame({'POA':randint(1, 10, 50)}, index=rng)
labels = df.index.strftime('%H:%M')
x = np.arange(len(labels))
fig, ax = plt.subplots()
plt.plot(x, df['POA'])
plt.xticks(x, labels)
skip_every_n = 10
for i, x_label in enumerate(ax.xaxis.get_ticklabels()):
    if i % skip_every_n != 0:
        x_label.set_visible(False)

推荐阅读