如何统计给定日期过去24小时事件次数?附DataFrame订单统计场景
统计expedition_date过去24小时内的订单下单次数
核心思路
我们需要为每行计算该行expedition_date往前推24小时到expedition_date本身这个区间内,order_date落在其中的订单数量。由于不能直接用rolling(它基于自身order_date统计),可以用二分查找或者区间匹配的方式实现,其中二分查找效率更高,适合大数据场景。
方法一:基于二分查找的高效实现
这种方法利用pandas.Series.searchsorted的二分查找能力,时间复杂度为O(n log n),适合处理大规模数据:
- 确保日期列是datetime类型
import pandas as pd # 将日期列转换为datetime格式(如果还没转的话) df['order_date'] = pd.to_datetime(df['order_date']) df['expedition_date'] = pd.to_datetime(df['expedition_date'])
- 排序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)
- 用二分查找统计区间内的订单数
# 找到每个下限在排序后的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
相关产品推荐
相关产品推荐

