基于两日期差值外推销售数据并调整列值的技术实现需求
按日期线性外推季度月初始销售数据并拼接原表
原始数据
我有某季度每月初的销售数据,以2022年第一季度为例,包含1月1日、2月1日、3月1日的销售记录,具体数据如下:
| Date | Country | Region | Sales |
|---|---|---|---|
| 01/01/2022 | UK | EMEA | 100,000 |
| 02/01/2022 | UK | EMEA | 170,000 |
| 03/01/2022 | UK | EMEA | 120,000 |
| 01/01/2022 | US | AMS | 90,000 |
| 02/01/2022 | US | AMS | 110,000 |
| 03/01/2022 | US | AMS | 160,000 |
需求说明
需要基于相邻两个月初的日期差值,线性外推这两个日期之间每天的销售额,最终将外推结果与原表拼接。具体规则:
- 以1月1日到2月1日区间为例:计算两日期差为31天,1月2日销售额 = 1月1日销售额 + (2月1日销售额 - 1月1日销售额) * (1/31);1月3日按
(2/31)比例递增,以此类推直到1月31日。 - 进入下一个区间(如2月1日到3月1日)时,重新计算该区间的日期总天数,再按相同的线性比例规则外推每日销售额。
解决方案(SAS实现)
以下是SAS代码实现,完成数据读取、外推计算与合并:
/* 1. 读取原始数据,处理日期和数值格式 */ data sales_initial; infile datalines dlm='|' dsd truncover; input Date : mmddyy10. Country $ Region $ Sales : comma10.; format Date date9.; datalines; 01/01/2022|UK|EMEA|100,000 02/01/2022|UK|EMEA|170,000 03/01/2022|UK|EMEA|120,000 01/01/2022|US|AMS|90,000 02/01/2022|US|AMS|110,000 03/01/2022|US|AMS|160,000 ; run; /* 2. 按Country、Region分组,排序并获取相邻日期的信息 */ data sales_with_next; set sales_initial; by Country Region Date; /* 获取下一行的日期和销售额 */ next_date = lead(Date); next_sales = lead(Sales); /* 计算当前区间的总天数 */ interval_days = intck('day', Date, next_date); /* 只保留非最后一行的记录(最后一行没有后续日期,无需外推) */ if not(last.bygroup); run; /* 3. 生成区间内的每日日期,并计算外推销售额 */ data sales_extrapolated; set sales_with_next; /* 生成从当前日期+1天到next_date-1天的所有日期 */ do day_offset = 1 to interval_days - 1; current_date = intnx('day', Date, day_offset); /* 线性外推计算销售额 */ extrapolated_sales = Sales + (next_sales - Sales) * (day_offset / interval_days); /* 保留维度字段,输出外推记录 */ output; end; format current_date date9.; keep Country Region current_date extrapolated_sales; rename current_date=Date extrapolated_sales=Sales; run; /* 4. 合并原始数据和外推数据,按日期、国家、地区排序 */ data final_sales; set sales_initial sales_extrapolated; by Country Region Date; run; /* 查看结果 */ proc print data=final_sales(obs=30) noobs; var Date Country Region Sales; format Sales comma12.2; run;
代码说明
- 第一步读取原始数据,将
Date转为SAS日期格式,Sales转为数值型(去除逗号)。 - 第二步通过
lead()函数获取每组内下一个月初的日期和销售额,计算区间总天数。 - 第三步用循环生成区间内的每日日期,按线性比例计算外推销售额。
- 最后合并原始数据与外推数据,得到包含每日销售额的完整表格。
内容的提问来源于stack exchange,提问作者SASguru
相关产品推荐
相关产品推荐

