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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:43:14