如何在含5000条swap spread日度数据集中保留每月最后工作日?
解决方案:提取数据集每月最后一个工作日记录
问题背景
拥有约5000条swap spread日度收益率的数据集,需保留每个月份实际存在的最后一个工作日记录,原代码if date~=(intx('month',date,-1)+1) then delete;存在日期遗漏问题。
原代码问题分析
原代码试图通过日历当月最后一天筛选,但intx('month',date,-1)+1逻辑错误,即便修正为intnx('month', date, 0, 'e')(日历月末),也无法适配“数据中实际存在的最后工作日”——若月末为周末/节假日,数据中无该日期,就会误删真实的最后工作日记录。
有效解决方案
方法1:SAS BY组处理(推荐)
利用SAS的BY分组特性,直接取每个月组的最后一条记录:
/* 先确保数据按日期升序排序 */ proc sort data=your_raw_data; by date; run; /* 提取每月最后一条记录 */ data last_workday_month; set your_raw_data; /* 按年-月分组 */ by year(date) month(date); /* 保留每个月组的最后一条观测 */ if last.month; run;
- 逻辑:
year(date)和month(date)将数据按年、月分组,last.month标记每个月组的最后一条记录,即该月数据中最晚的日期(实际存在的最后工作日)。
方法2:PROC SQL分组筛选
通过子查询找出每个月的最大日期,再匹配原数据:
proc sql; create table last_workday_month as select * from your_raw_data where (year(date), month(date), date) in ( /* 子查询获取每个月的最大日期 */ select year(date), month(date), max(date) from your_raw_data group by year(date), month(date) ); quit;
- 逻辑:子查询按年-月分组,得到每个月在数据中存在的最大日期,主查询筛选出对应日期的完整记录。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

