基于日期条件统计Pandas DataFrame行并新增列存储统计结果
解决方案
直接逐行遍历全表的效率极低,数据量大时会严重影响性能,推荐使用「预分组存储设备时间序列+二分查找统计区间数量」的方案,实现逻辑简洁且性能优异:
步骤1:导入依赖&预处理时间字段
import pandas as pd from datetime import timedelta from bisect import bisect_left, bisect_right # 确保两个时间字段为datetime格式 df['order_creation_time'] = pd.to_datetime(df['order_creation_time']) df['creation_time_device'] = pd.to_datetime(df['creation_time_device'])
步骤2:提取唯一订单组合避免重复计算
同一个order_id对应的order_creation_time、device_id完全一致,先去重减少计算量:
order_unique = df[['order_id', 'device_id', 'order_creation_time']].drop_duplicates()
步骤3:预构建设备时间映射并统计
# 按设备分组,预存排序后的所有订单接收时间 device_time_map = df.groupby('device_id')['creation_time_device'].apply(sorted).to_dict() # 统计指定时间区间内的订单数 def count_3min_orders(row): dev = row['device_id'] order_time = row['order_creation_time'] # 时间区间:订单创建时间前3分钟 ~ 订单创建时间,可根据实际需求调整区间范围 start = order_time - timedelta(minutes=3) end = order_time # 二分查找统计区间内的数量 time_list = device_time_map[dev] return bisect_right(time_list, end) - bisect_left(time_list, start) # 计算每个订单对应的统计值 order_unique['orders_received'] = order_unique.apply(count_3min_orders, axis=1)
步骤4:合并结果回原表
df = df.merge( order_unique[['order_id', 'device_id', 'order_creation_time', 'orders_received']], on=['order_id', 'device_id', 'order_creation_time'], how='left' )
如果你的实际需求是统计订单创建后3分钟内设备接收的订单数,只需要修改count_3min_orders函数中的区间为start = order_time、end = order_time + timedelta(minutes=3)即可。
内容的提问来源于stack exchange,提问作者bunta
相关产品推荐
相关产品推荐

