You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按小时/天/月聚合数据并统计FN/TP/FP数量?

解决方案

第一步:先规范time列格式

从CSV导入的time列大概率是字符串类型,必须先转成datetime格式,这是后续分组/重采样的前提:

df['time'] = pd.to_datetime(df['time'])

更高效的分组统计方案

方案1:groupby + pd.Grouper(灵活通用)

这种方式无需修改索引,直接按指定时间粒度分组,同时保留完整time字段,完美适配后续可视化需求:

# 按天统计各类型次数
daily_stats = df.groupby([pd.Grouper(key='time', freq='D'), 'Hit/Miss']).size().unstack(fill_value=0).reset_index()

# 按小时统计
hourly_stats = df.groupby([pd.Grouper(key='time', freq='H'), 'Hit/Miss']).size().unstack(fill_value=0).reset_index()

# 按月统计
monthly_stats = df.groupby([pd.Grouper(key='time', freq='M'), 'Hit/Miss']).size().unstack(fill_value=0).reset_index()
  • freq 参数可灵活替换:'H'(小时)、'D'(天)、'M'(月)、'Y'(年)等
  • unstack(fill_value=0) 将FN/TP/FP转为列,缺失值补0,直接适配可视化输入格式
  • reset_index() 把分组后的时间索引转回普通列,保留完整time字段

方案2:修复resample失败问题

之前resample失败基本是因为time列不是datetime类型或未设为索引,按以下步骤操作即可:

# 临时将time设为索引
df_resample = df.set_index('time')

# 按天重采样并统计各类型次数
daily_resample = df_resample['Hit/Miss'].resample('D').value_counts().unstack(fill_value=0).reset_index()

# 将索引转回普通time列(可选)
daily_resample.rename(columns={'index': 'time'}, inplace=True)

resample的优势是时间粒度处理更简洁,适合批量生成不同时段的统计结果。

最佳可视化图表类型

根据你的数据场景,推荐这几种:

  • 堆叠柱状图:最适合展示同一时段内FN、TP、FP的绝对数量和占比,不管小时/天/月粒度都适用,直观对比各类型的分布差异
  • 多系列折线图:若重点关注各类型随时间的变化趋势(比如TP率的波动),折线图能清晰呈现三类数据的走势变化
  • 热力图:如果做小时+天的组合粒度统计(比如一周内每天的小时分布),热力图可直观展示不同时段的事件密集程度,比如哪些时段FP出现频率最高

内容的提问来源于stack exchange,提问作者confused student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:45:28