我有一个非常短(<20行)的数据集,如下所示:
Effective_Date Pct
-------------- ---
01JAN2000 50%
...
11FEB2014 55%
13JUL2014 65%
我想写一个带有日期Eval_Date
的宏,并返回在该日期生效的Pct
。为了清楚起见,我知道这可以通过某种PROC SQL
构造来完成,但我想编写一个可以在数据步骤中使用的函数式宏。
例如,%pct('12jul2014'd)
应评估为55%
。
答案 0 :(得分:3)
假设您的源数据集是effpct
且pct是数字格式,格式为percent.
,请使用它来创建包含每天和有效百分比的格式:
/* Merge without a by statement, using firstobs=2 to do a look-ahead join to determine the 'effective to' date */ data pct_fmt ; retain fmtname 'EFFPCT' type 'N' ; merge effpct effpct (firstobs=2 keep=effective_date rename=(effective_date=to_date)) ; if missing(to_date) then to_date = date() ; /* Take last record up to current date */ do start = effective_date to (to_date - 1) ; label = pct ; output ; end ; run ; /* 'Compile' the format */ proc format cntlin=pct_fmt ; run ; /* Abstract put(var,format) into a function-style macro */ %MACRO PCT(DT) ; put(&DT,EFFPCT.) ; %MEND ; /* Then use it in a datastep... */ data want ; input date date9. ; eff_pct = %PCT(date) ; format eff_pct percent9. ; datalines ; 01JAN2000 13FEB2014 20JUL2014 ; run ;
或者,使用%SYSFUNC
和putn
可以将日期转换为datastep之外的百分比,例如在title
声明中:
%MACRO PCT2(DT) ; %SYSFUNC(putn(%SYSFUNC(putn(&DT,EFFPCT.)),percent.)) %MEND ; title "The effective pct on 09JUL2013 was %PCT2('09jul2013'd)" ;