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

基于日期条件统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:05