如何基于Pandas按规则计算SKU的缺货天数?
计算SKU缺货天数的实现方案
需求说明
根据库存数据,需按以下规则计算每个SKU的缺货天数:
- 若某SKU所有日期的
Current_Stock< 1,缺货天数为该SKU的总记录天数(示例:SKU B) - 若某SKU存在补货记录(
Current_Stock≥1),则从最后一次补货日起,统计之后的缺货天数(示例:SKU C最后一次补货为7/29,之后无日期,缺货天数为0)
实现代码
import pandas as pd # 原始数据 data = {'SKU': ['A', 'A', 'A', 'A', 'B','B','B','B', 'C','C','C','C', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'F', 'F', 'F', 'F'], 'Current_Stock': [2,0,0,0, 0,0,-1,-1, 2,-1,0,1, 2,2,3,1, 2,0,0,1, 2,-1,1,0], 'Date_Updated': ['2024/7/26', '2024/7/27','2024/7/28', '2024/7/29', '2024/7/26', '2024/7/27','2024/7/28', '2024/7/29', '2024/7/26', '2024/7/27','2024/7/28', '2024/7/29', '2024/7/26', '2024/7/27','2024/7/28', '2024/7/29', '2024/7/26', '2024/7/27','2024/7/28', '2024/7/29', '2024/7/26', '2024/7/27','2024/7/28', '2024/7/29']} df = pd.DataFrame(data) # 转换日期列为日期类型,保证时间排序准确 df['Date_Updated'] = pd.to_datetime(df['Date_Updated']) # 定义单个SKU的缺货天数计算逻辑 def calculate_oos_days(group): # 按日期排序,确保时间顺序正确 sorted_group = group.sort_values('Date_Updated') # 筛选所有补货日期(库存≥1的记录) restock_dates = sorted_group[sorted_group['Current_Stock'] >= 1]['Date_Updated'] if not restock_dates.any(): # 无补货记录,缺货天数为总天数 return len(sorted_group) else: # 取最后一次补货的日期 last_restock_date = restock_dates.max() # 筛选最后一次补货之后的所有记录 post_restock_records = sorted_group[sorted_group['Date_Updated'] > last_restock_date] # 统计补货后缺货的天数(库存<1的记录数) return len(post_restock_records[post_restock_records['Current_Stock'] < 1]) # 按SKU分组计算缺货天数 result = df.groupby('SKU').apply(calculate_oos_days).reset_index(name='Days_Out_of_Stock') print(result)
逻辑解释
- 日期转换:将
Date_Updated转为日期类型,避免字符串排序导致的时间顺序错误 - 分组处理:对每个SKU的记录单独计算:
- 无补货记录的SKU:直接返回总记录数(总天数)
- 有补货记录的SKU:找到最后一次补货日期,统计该日期之后库存<1的天数
- 结果匹配:最终输出结果与示例预期完全一致:
SKU Days_Out_of_Stock A 3 B 4 C 0 D 0 E 0 F 1
内容的提问来源于stack exchange,提问作者astonle
相关产品推荐
相关产品推荐

