如何用Pandas计算连续销售日期区间的汇总统计?
解决Pandas统计连续销售天数区间总销量的问题
我明白你的问题了——你之前的代码误把**每月的日期号(比如8号、12号)**划分到区间里,但这和你需要的「连续销售天数」完全不是一回事。咱们来一步步实现正确的统计逻辑:
问题分析
你需要先识别出数据中所有连续的日期段(比如12-08-16到15-08-16是连续4天),然后计算每个连续段的天数,再把对应段的销量汇总到指定的区间(1-3天、4-7天等)里。
完整实现代码
import pandas as pd # 1. 读取并预处理数据(替换成你的数据读取方式) data = { "DATE_LOCATION": ["07-08-16 0:00", "08-08-16 0:00", "12-08-16 0:00", "13-08-16 0:00", "14-08-16 0:00", "15-08-16 0:00", "22-10-16 0:00", "23-10-16 0:00", "26-10-16 0:00", "28-10-16 0:00", "29-10-16 0:00", "30-10-16 0:00"], "Sold": [2,7,3,1,2,1,1,2,1,1,3,3] } df = pd.DataFrame(data) # 2. 转换日期格式并排序(必须排序,否则连续日期判断会出错) df["DATE_LOCATION"] = pd.to_datetime(df["DATE_LOCATION"], format="%d-%m-%y %H:%M") df = df.sort_values("DATE_LOCATION").reset_index(drop=True) # 3. 识别连续日期的分组:计算日期差,标记非连续的点,生成组ID df["date_diff"] = df["DATE_LOCATION"].diff().dt.days # 第一个行的diff是NaN,标记为新组;日期差不等于1的也是新组 df["group_id"] = (df["date_diff"] != 1).cumsum() # 4. 按组计算每个连续段的天数和总销量 grouped = df.groupby("group_id").agg( days=("DATE_LOCATION", lambda x: (x.max() - x.min()).days + 1), total_sold=("Sold", "sum") ).reset_index() # 5. 定义天数区间映射函数 def map_days_interval(days): if 1 <= days <= 3: return "1-3" elif 4 <= days <= 7: return "4-7" elif 8 <= days <= 15: return "8-15" else: return ">16" grouped["Days"] = grouped["days"].apply(map_days_interval) # 6. 按区间汇总总销量,确保所有区间都显示(即使销量为0) result = grouped.groupby("Days")["total_sold"].sum().reindex( ["1-3", "4-7", "8-15", ">16"], fill_value=0 ).reset_index(name="Sold") print(result)
代码解释
- 日期预处理:转换为datetime类型并排序是关键,确保我们能正确识别连续日期。
- 连续分组标记:用
diff()计算相邻日期的差值,当差值不等于1天时,说明是新的连续段,用cumsum()生成唯一的组ID。 - 分组计算:对每个连续组,计算天数(最大日期-最小日期+1)和该组的总销量。
- 区间映射与汇总:把每个组的天数映射到目标区间,最后汇总每个区间的总销量,并用
reindex确保所有区间都显示(即使没有对应数据,销量为0)。
运行结果(匹配你的期望输出)
Days Sold 0 1-3 20 1 4-7 7 2 8-15 0 3 >16 0
内容的提问来源于stack exchange,提问作者san
相关产品推荐
相关产品推荐

