如何基于时间列表绘制带线性时间轴的小时频次直方图(含滚动平均)
问题描述
我有如下时间列表:
times = ['2022-12-09T16:06:34.000000000', '2022-12-09T16:06:34.000000000', '2022-12-09T16:09:47.000000000', ... , '2022-12-09T17:46:10.000000000', '2022-12-09T17:46:10.000000000', '2022-12-09T17:46:10.000000000', '2022-12-09T17:49:10.000000000', '2022-12-09T17:49:10.000000000']
想用matplotlib.pyplot绘制统计每小时出现次数的直方图,目前写了这段代码:
times = pd.Series(extract_times()).astype("datetime64") times.groupby([times.dt.day, times.dt.hour]).count() times.plot()
但生成的图表x轴刻度不符合预期,我想要x轴用线性时间刻度,另外最好能添加滚动平均,或者改成柱状图展示。
解决方案
1. 先处理数据:按小时聚合并保留时间索引
用resample替代groupby更合适,它会自动生成连续的时间区间,确保x轴能识别为线性时间刻度:
import pandas as pd import matplotlib.pyplot as plt # 假设extract_times()返回你的时间列表 times = pd.Series(extract_times()).astype("datetime64[ns]") # 按小时重采样,统计每个小时的出现次数 hourly_counts = times.resample('H').count()
2. 绘制柱状图
直接用聚合后的数据绘制柱状图,x轴会自动使用线性时间刻度:
plt.figure(figsize=(10, 6)) hourly_counts.plot(kind='bar') plt.xlabel('时间(小时)') plt.ylabel('出现次数') plt.title('每小时时间点出现次数统计') plt.xticks(rotation=45) # 旋转x轴标签避免重叠 plt.tight_layout() # 自动调整布局 plt.show()
3. 添加滚动平均
如果需要叠加滚动平均(比如3小时窗口),可以在柱状图上再加一条折线:
plt.figure(figsize=(10, 6)) # 绘制柱状图 hourly_counts.plot(kind='bar', label='每小时计数') # 计算3小时滚动平均并绘制 rolling_avg = hourly_counts.rolling(window=3).mean() rolling_avg.plot(kind='line', color='red', marker='o', label='3小时滚动平均') plt.xlabel('时间(小时)') plt.ylabel('出现次数') plt.title('每小时时间点出现次数及滚动平均') plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show()
4. 折线图+滚动平均(可选)
如果更偏好折线图展示,同样基于重采样后的数据:
plt.figure(figsize=(10, 6)) hourly_counts.plot(kind='line', marker='o', label='每小时计数') # 计算2小时滚动平均(窗口大小可按需调整) rolling_avg = hourly_counts.rolling(window=2).mean() rolling_avg.plot(kind='line', color='red', linestyle='--', label='2小时滚动平均') plt.xlabel('时间(小时)') plt.ylabel('出现次数') plt.title('每小时时间点出现次数统计') plt.legend() plt.grid(True) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者naraghi
相关产品推荐
相关产品推荐

