如何创建以周四为起始日的SAS自定义周格式?
自定义SAS周格式(周四为周起始)
由于SAS默认的周格式(U/V/W描述符)仅支持周一或周日作为周起始,要实现周四为起始的自定义周格式,需要手动计算周归属并创建格式,具体步骤如下:
核心思路
通过调整日期偏移,将每个日期映射到其所属周四起始周的基准日,再基于基准日计算年份和周数,最后封装为可复用的格式或函数。
步骤1:计算自定义周的年份与周数
在数据步中通过日期偏移调整和周数计算,得到每个日期对应的周四起始周标识:
data demo; input date date9.; format date date9.; /* 计算日期相对于周四的偏移:周四是weekday返回5,偏移量为当前日期到所属周周四的天数 */ offset = weekday(date) - 5; if offset > 0 then offset = offset - 7; /* 周五到下周三的日期,调整到当前周的周四 */ /* 得到该日期所属周四起始周的基准日(周四) */ week_start_thu = date - offset; /* 计算基准日所在的年份和周数 */ week_year = year(week_start_thu); week_num = intck('week', mdy(1,1,week_year), week_start_thu) + 1; /* 修正跨年边界情况:12月的基准日可能属于下一年第一周,1月的可能属于上一年最后一周 */ if month(week_start_thu) = 12 and week_num = 1 then week_year = week_year + 1; if month(week_start_thu) = 1 and week_num > 50 then week_year = week_year - 1; /* 生成标准周标识(如2024W01) */ custom_week = cats(week_year, 'W', put(week_num, z2.)); datalines; 01JAN2024 04JAN2024 05JAN2024 31DEC2023 ; run;
步骤2:创建可复用的自定义格式
如果需要直接通过put()函数调用自定义周格式,可结合FCMP自定义函数实现:
/* 创建自定义函数,封装周计算逻辑 */ proc fcmp outlib=work.userfuncs.dateutils; function thu_start_week(date) $; offset = weekday(date) - 5; if offset > 0 then offset = offset - 7; week_start_thu = date - offset; week_year = year(week_start_thu); week_num = intck('week', mdy(1,1,week_year), week_start_thu) + 1; if month(week_start_thu) = 12 and week_num = 1 then week_year = week_year + 1; if month(week_start_thu) = 1 and week_num > 50 then week_year = week_year - 1; return(cats(week_year, 'W', put(week_num, z2.))); endsub; run; /* 启用自定义函数库 */ options cmplib=work.userfuncs; /* 直接调用函数生成自定义周格式 */ data test; input date date9.; format date date9.; custom_week = thu_start_week(date); datalines; 10JAN2024 25DEC2023 01FEB2024 ; run;
关键说明
weekday()函数:返回1(周日)到7(周六),周四对应5,以此计算偏移量- 边界处理:必须修正跨年时的周数归属,避免出现2023W53或2024W01的错误映射
- 复用性:通过FCMP函数封装逻辑后,可在任意数据步中直接调用,无需重复编写计算代码
内容的提问来源于stack exchange,提问作者Fable
相关产品推荐
相关产品推荐

