基于时间序列的月维度3小时区间箱线图实现方法咨询
实现按月份分组、3小时区间的箱线图
步骤1:数据预处理
先给原始DataFrame添加两个关键字段,用于后续分组和绘图:
Month:提取日期的YYYY-MM格式标签(避免跨年时同月份数据混淆)3H_Interval:标记每条数据所属的3小时时间区间(格式如00:00-03:00)
import pandas as pd import random import matplotlib.pyplot as plt import seaborn as sns # 生成示例数据 dikt={'Date': pd.date_range("2018-01-01", periods=1500, freq="5T"), 'Snd': [random.randrange(1, 50, 1) for i in range(1500)]} df=pd.DataFrame(dikt) # 添加月份标签列 df['Month'] = df['Date'].dt.strftime('%Y-%m') # 生成3小时区间标签 df['3H_Interval'] = df['Date'].dt.hour // 3 * 3 df['3H_Interval'] = df['3H_Interval'].apply(lambda x: f"{x:02d}:00-{x+3:02d}:00")
步骤2:按月份分组绘制箱线图
遍历每个月份的子数据集,单独绘制对应月份的箱线图,x轴为3小时区间,y轴为Snd值:
# 获取所有唯一的月份 unique_months = df['Month'].unique() # 设置绘图风格 sns.set_style("whitegrid") # 逐个月份生成箱线图 for month in unique_months: # 筛选当前月份的数据 month_data = df[df['Month'] == month] # 创建画布 plt.figure(figsize=(10, 6)) # 绘制箱线图,指定x轴顺序保证时间递增 sns.boxplot( x='3H_Interval', y='Snd', data=month_data, order=sorted(month_data['3H_Interval'].unique()) ) # 设置图表标题和标签 plt.title(f'{month} 各3小时区间Snd值箱线图') plt.xlabel('3小时时间区间') plt.ylabel('Snd值') # 调整x轴标签角度避免重叠 plt.xticks(rotation=45) # 自动调整布局 plt.tight_layout() # 显示图表 plt.show()
关键细节说明
- 3小时区间的计算逻辑:通过
dt.hour // 3 *3得到区间起始小时(0、3、6...21),再格式化为易读的区间字符串。 - 指定
order参数可以确保x轴的3小时区间按时间顺序排列,不会出现乱序。 - 使用
seaborn绘制箱线图比原生matplotlib更美观,且自带网格便于数据对比。
内容的提问来源于stack exchange,提问作者savvas pehlivanidis
相关产品推荐
相关产品推荐

