如何用pandas/Python实现符合先进先出规则的发货(Dispatch)列计算逻辑
实现逻辑
核心遵循「最早批次优先分配」规则,单商品总发货量严格不超过对应订单总量,具体逻辑如下:
- 所有批次先按生产日期/入库时间升序排序,确保更早批次先被分配
- 针对每类商品单独计算发货量,初始化剩余可发货额度=该商品总订单量
- 逐行遍历排序后的批次数据:
- 剩余额度为0时,当前批次该商品发货量填0
- 剩余额度>0时,当前批次发货量取「本批次该商品的可出库数量」和「剩余可发货额度」的较小值,同步扣减剩余额度
代码实现(Python Pandas示例,以BUN商品为例)
import pandas as pd # 示例数据,可替换为你的实际数据 # 假设数据列包含:批次ID、批次时间、商品类型、本批次可发量、总订单量 data = [ ["P001", "2024-01-01", "BUN", 20, 60], ["P002", "2024-01-02", "BUN", 25, 60], ["P003", "2024-01-03", "BUN", 30, 60], ["P004", "2024-01-04", "BUN", 15, 60] ] df = pd.DataFrame(data, columns=["batch_id", "batch_date", "sku", "available_qty", "total_order_qty"]) # 按批次时间升序排序,保证早批次优先 df = df.sort_values("batch_date").reset_index(drop=True) remaining = df.loc[0, "total_order_qty"] dispatch_list = [] for idx, row in df.iterrows(): if remaining <= 0: dispatch = 0 else: dispatch = min(row["available_qty"], remaining) remaining -= dispatch dispatch_list.append(dispatch) df["Dispatch"] = dispatch_list print(df)
输出示例
| batch_id | batch_date | sku | available_qty | total_order_qty | Dispatch |
|---|---|---|---|---|---|
| P001 | 2024-01-01 | BUN | 20 | 60 | 20 |
| P002 | 2024-01-02 | BUN | 25 | 60 | 25 |
| P003 | 2024-01-03 | BUN | 30 | 60 | 15 |
| P004 | 2024-01-04 | BUN | 15 | 60 | 0 |
可以看到BUN的Dispatch列总和为20+25+15=60,刚好等于总订单量,且优先分配了更早的批次。
效果示例图

内容的提问来源于stack exchange,提问作者sumanth1601
相关产品推荐
相关产品推荐

