Pandas按日resample统计各错误类型出现次数的实现方法
解决方案
你之前的代码问题在于直接使用带时分秒的原始time字段做分组,每条不同时间戳的记录会被单独划分为一组,无法合并同一天的同类型错误记录,按以下步骤实现即可。
基础实现(仅统计有出现记录的日期-错误类型组合)
- 首先确保时间列被正确解析为pandas datetime格式
- 将时间截断到日维度,再和错误类型联合分组计数即可
import pandas as pd # 解析时间列 df['time'] = pd.to_datetime(df['time']) # 按日+错误类型统计次数 result = ( df # 新增日期列,将时间截断到当日0点 .assign(date = df['time'].dt.floor('d')) # 联合分组 .groupby(['date', 'error'], as_index=False) # 计数 .size() # 把列名改回和期望输出一致 .rename(columns={'date': 'time'}) )
运行后得到的结果和你给出的期望输出完全一致。
全量覆盖实现(包含所有日期、所有错误类型,无出现记录则计数为0)
如果需要覆盖完整日期段内的所有错误类型,即使某天某类错误一次都没出现也展示为0,使用重索引补全即可:
df['time'] = pd.to_datetime(df['time']) # 提取日期维度 df['date'] = df['time'].dt.floor('d') # 生成数据覆盖范围内的完整日期序列 full_date_range = pd.date_range( start=df['date'].min(), end=df['date'].max(), freq='D' ) # 拿到所有出现过的错误类型 all_error_types = df['error'].unique() # 生成 日期+错误类型 的全量组合索引 full_multi_index = pd.MultiIndex.from_product( [full_date_range, all_error_types], names=['time', 'error'] ) # 统计后重索引补全缺失值 result = ( df .groupby(['date', 'error']) .size() .reindex(full_multi_index, fill_value=0) .reset_index(name='size') )
示例输出
针对你给出的测试数据,运行上述代码输出如下:
time error size 0 2021-10-03 2222 2 1 2021-10-03 3333 2 2 2021-10-03 4444 1
内容的提问来源于stack exchange,提问作者vloubes
相关产品推荐
相关产品推荐

