Pandas如何同时按标签分组与时间粒度聚合均值后绘制折线图
按label分折线+时间粒度聚合绘图实现
需要实现的多折线效果参考:
图表基础规则:
- x轴:
datetime时间戳 - y轴:
count计数值 - 不同折线对应
label字段的不同取值 - 大数据量场景下先按1小时/1天粒度聚合计算count均值
核心问题原因
之前的两段代码分别只实现了单一维度的分组逻辑:
- 仅按
label分组绘图:没有做时间维度的重采样聚合 - 仅按时间粒度聚合求均值:没有拆分
label维度,所有label的数据会被混在一起计算
只需要把两个分组规则同时传入groupby即可实现需求。
完整实现步骤
数据预处理
读入的csv中datetime是unix时间戳格式,需要先转为pandas可识别的时间类型,再设为数据索引:import pandas as pd import matplotlib.pyplot as plt # 读取csv数据 df = pd.read_csv("your_data_path.csv") # 把秒级unix时间戳转为datetime类型 df["datetime"] = pd.to_datetime(df["datetime"], unit="s") # 将时间列设为索引 df = df.set_index("datetime")双维度分组聚合
分组时同时传入时间粒度规则和label字段作为分组键,计算每个时间窗口下每个label对应的count均值,再把label维度转为列方便绘图:# freq参数控制聚合粒度:'1H'为1小时,'1D'为1天,'2min'为2分钟,按需调整即可 df_agg = df.groupby( [pd.Grouper(freq='1H'), "label"] )["count"].mean().unstack()末尾的
unstack()操作会把多层行索引中的label层级转换为列索引,最终输出的表结构为:行是聚合后的时间点,每一列对应一个label的均值结果,刚好适配pandas多折线图的输入要求。生成折线图
直接对聚合后的结果调用plot方法,会自动为每个label列生成独立折线:df_agg.plot( ylabel="count", xlabel="datetime", figsize=(10,6) # 可按需调整画布大小 ) plt.show()
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

