使用Pandas识别允许中断的可变长度销售连续周期
使用Pandas识别可含间隔的销售连续周期
需求:筛选DataFrame,定位存在销售(sold=1)的连续时段,允许时段内包含若干无销售日期,目标选中示例数据中第12至19行(对应2023-12-05至2023-12-14的记录)。
示例数据准备
import pandas as pd data = [['2023-11-16', 1], ['2023-11-17', 0], ['2023-11-20', 1], ['2023-11-21', 0], ['2023-11-22', 1], ['2023-11-24', 0], ['2023-11-27', 0], ['2023-11-28', 0], ['2023-11-29', 0], ['2023-11-30', 0], ['2023-12-01', 0], ['2023-12-04', 0], ['2023-12-05', 1], ['2023-12-06', 1] , ['2023-12-07', 1], ['2023-12-08', 1], ['2023-12-11', 0], ['2023-12-12', 0], ['2023-12-13', 1], ['2023-12-14', 1], ['2023-12-15', 0], ['2023-12-18', 0], ['2023-12-19', 0], ['2023-12-20', 0]] df = pd.DataFrame(data, columns=['date', 'sold']) df['date'] = pd.to_datetime(df['date']) # 转换为日期格式,方便间隔计算
解决方案
核心思路:先给有销售的日期分组(间隔在阈值内的归为同一组),再将组内的无销售日期纳入对应分组,最后筛选目标组。
1. 标记销售分组
# 标记有销售的行 df['has_sale'] = df['sold'] == 1 # 提取有销售的日期序列 sale_dates = df[df['has_sale']]['date'] # 初始化分组列 df['sale_group'] = 0 if not sale_dates.empty: group_id = 1 df.loc[sale_dates.index[0], 'sale_group'] = group_id # 遍历销售日期,根据间隔天数分组 for i in range(1, len(sale_dates)): # 这里设置间隔阈值为3天(对应示例中周末的间隔),可按需调整 if (sale_dates.iloc[i] - sale_dates.iloc[i-1]).days <= 3: df.loc[sale_dates.index[i], 'sale_group'] = group_id else: group_id += 1 df.loc[sale_dates.index[i], 'sale_group'] = group_id # 前后填充分组,把中间的无销售行归入对应周期组 df['sale_group'] = df['sale_group'].ffill().bfill()
2. 筛选目标周期
示例中目标周期对应group_id=2,直接筛选即可:
target_rows = df[df['sale_group'] == 2] print(target_rows)
运行后将得到需求中的第12至19行记录(Pandas默认索引为11到18)。
调整间隔阈值
如果需要允许更长的无销售间隔,修改判断条件中的天数阈值即可(比如允许间隔5天,就把<=3改成<=5)。
内容的提问来源于stack exchange,提问作者cksrc
相关产品推荐
相关产品推荐

