SAS自定义用户格式转换为宏程序实现咨询
SAS夏令时格式生成宏程序转换方案
完整转换后的宏代码
%macro create_dst_fmt( yr_beg=, /* 起始年份,必选参数 */ yr_end=, /* 结束年份,必选参数 */ fmtname=dst, /* 生成的格式名,可选,默认值为dst */ out_ds=DST_FMT /* 中间生成的format输入数据集名,可选,默认值为DST_FMT */ ); /* 必选参数校验 */ %if &yr_beg.= or &yr_end.= %then %do; %put ERROR: 必须传入yr_beg(起始年份)和yr_end(结束年份)参数; %return; %end; data &out_ds.(drop=year); attrib hlo length=$1 start dst_start end format=mmddyy10.; fmtname="&fmtname."; type="N"; do year=&yr_beg. to &yr_end.; start= nwkdom(2, 1, 3, year)+1; /* 3月第二个周日次日为夏令时起始日 */ end= nwkdom(1, 1, 11, year); /* 11月第一个周日为夏令时结束日 */ dst_start= start - 1; label='*'; output; end; /* 非夏令时区间的默认配置 */ start=.;end=.; hlo="O"; label=''; output; run; proc format cntlin=&out_ds.; run; %mend create_dst_fmt;
调用方法
- 生成你原需求中2007-2020年的
dst格式,直接执行如下代码即可:
%create_dst_fmt(yr_beg=2007, yr_end=2020);
- 如需自定义格式名、中间数据集名,可指定可选参数:
%create_dst_fmt(yr_beg=2010, yr_end=2023, fmtname=dst_us, out_ds=work.dst_input);
注意事项
- 宏运行后生成的格式会在当前SAS会话中直接生效,原有筛选日期、偏移小时数据的逻辑不需要做任何调整,和你原代码的运行效果完全一致
- 支持参数传入其他宏变量,可适配批量生成多套不同年份区间夏令时格式的需求
内容的提问来源于stack exchange,提问作者C McCown
相关产品推荐
相关产品推荐

