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

PySpark如何查找2021年1-3月订单对应的上一笔最近下单时间

解决方案

实现思路

  • 不需要手动实现二分查找,直接利用Pandas内置的分组偏移函数即可高效完成计算,核心逻辑是:计算全量订单的上一笔订单时间后,再过滤出2021年1-3月的订单即可,避免提前过滤导致历史订单数据缺失。
  • 先按用户ID分组,组内按下单时间升序排序,取每个订单的前一条订单的下单时间作为PREV_ORDER_TIME,这一步会自动处理跨年份的历史订单匹配。
  • 最后过滤出目标时间段的订单即可,无前置订单的记录会自动返回null。

代码示例

import pandas as pd

# 假设你的全量DataFrame变量名为df
# 第一步:确保ORDERED_TIME是timestamp类型(如果已经是可以跳过)
df['ORDERED_TIME'] = pd.to_datetime(df['ORDERED_TIME'])

# 第二步:按用户分组,按下单时间排序后取前一条的时间
df = df.sort_values(by=['CUSTOMER_ID', 'ORDERED_TIME'], ignore_index=True)
df['PREV_ORDER_TIME'] = df.groupby('CUSTOMER_ID')['ORDERED_TIME'].shift(1)

# 第三步:过滤出2021年1-3月的订单
start_date = pd.Timestamp('2021-01-01')
end_date = pd.Timestamp('2021-04-01') # 左闭右开规则,覆盖3月31日全天的所有时间
result_df = df[(df['ORDERED_TIME'] >= start_date) & (df['ORDERED_TIME'] < end_date)]

# 提取需要的输出字段
result_df = result_df[['CUSTOMER_ID', 'ORDERED_TIME', 'ORDER_ID', 'PREV_ORDER_TIME']]

补充说明

  • 代码中shift(1)天然适配边界场景:如果用户在2021年1-3月的订单是首单,或者上一单在更早的历史区间,都能正确匹配或返回null。
  • 如果数据量达到千万级及以上,可改用PySpark的lag窗口函数实现,逻辑完全一致,参考SQL如下:
SELECT 
    CUSTOMER_ID,
    ORDERED_TIME,
    ORDER_ID,
    LAG(ORDERED_TIME) OVER(PARTITION BY CUSTOMER_ID ORDER BY ORDERED_TIME) AS PREV_ORDER_TIME
FROM all_orders
WHERE ORDERED_TIME >= '2021-01-01' AND ORDERED_TIME < '2021-04-01'

内容的提问来源于stack exchange,提问作者Jitesh Malipeddi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:27:01