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

如何统计给定日期过去24小时事件次数?附DataFrame订单统计场景

统计expedition_date过去24小时内的订单下单次数

核心思路

我们需要为每行计算该行expedition_date往前推24小时到expedition_date本身这个区间内,order_date落在其中的订单数量。由于不能直接用rolling(它基于自身order_date统计),可以用二分查找或者区间匹配的方式实现,其中二分查找效率更高,适合大数据场景。


方法一:基于二分查找的高效实现

这种方法利用pandas.Series.searchsorted的二分查找能力,时间复杂度为O(n log n),适合处理大规模数据:

  1. 确保日期列是datetime类型
import pandas as pd

# 将日期列转换为datetime格式(如果还没转的话)
df['order_date'] = pd.to_datetime(df['order_date'])
df['expedition_date'] = pd.to_datetime(df['expedition_date'])
  1. 排序order_date并计算区间边界
# 提取并排序所有order_date,用于后续二分查找
sorted_order_dates = df['order_date'].sort_values().reset_index(drop=True)

# 计算每个expedition_date对应的24小时区间下限
lower_bound = df['expedition_date'] - pd.Timedelta(hours=24)
  1. 用二分查找统计区间内的订单数
# 找到每个下限在排序后的order_date中的左插入位置
left_indices = sorted_order_dates.searchsorted(lower_bound, side='left')
# 找到每个expedition_date在排序后的order_date中的右插入位置
right_indices = sorted_order_dates.searchsorted(df['expedition_date'], side='right')

# 位置差就是区间内的订单数量,新增到原DataFrame
df['orders_in_last_24h'] = right_indices - left_indices

方法二:基于交叉合并的直观实现(适合小数据)

如果数据量较小,也可以用交叉合并+筛选的方式实现,逻辑更直观但效率较低:

# 生成包含每个expedition_date及其24小时区间下限的临时表
temp_df = df[['expedition_date']].assign(lower_bound=lambda x: x['expedition_date'] - pd.Timedelta(hours=24))

# 交叉合并原表的order_date和临时表的区间信息
merged = pd.merge(df[['order_date']], temp_df, how='cross')

# 筛选order_date落在对应区间内的记录,并按expedition_date分组计数
counts = merged[
    (merged['order_date'] >= merged['lower_bound']) & 
    (merged['order_date'] <= merged['expedition_date'])
].groupby('expedition_date').size().reset_index(name='orders_in_last_24h')

# 将计数结果合并回原DataFrame
df = df.merge(counts, on='expedition_date')

内容的提问来源于stack exchange,提问作者Carlos Navarro Astiasarán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:55:34