我正在阅读一些原始数据,其中有几个错误的日期。具体来说,有人在非闰年键入了“2 月 29 日”。例如:
data _null_;
input test :yymmdd8.;
format test date9.;
cards;
20270229
run;
客户希望恢复到 2 月 28 日。有没有快速/有效的方法可以做到这一点?例如相当于:
IF iserror(date) then date=date-1; ?
如有任何建议,不胜感激!
我会更加小心地确定日期。这是一种方法。嗯。
%put sysvlong=&sysvlong sysscpl=&sysscpl;
/* sysvlong=9.02.01M0P020508 sysscpl=W32_VSPRO */
/* read a date both as character(temp) and numeric(date).
if the numeric date is missing then check if the
character date ends with "0229," if so, then change it
to "0228" and see if it is a valid date.
If OK, then that is it. otherwise, keep it missing. */
%let FEB29 = 0229;
%let FEB28 = 0228;
data one;
drop temp;
input temp $char8. @1 date ?? yymmdd8.;
if missing(date) then link fix;
format date b8601da.;
put (_all_) (=);
return;
fix:
if length(strip(temp))^=8 then return;
if substr(temp,5) ^= "&FEB29" then return;
date = input(cat(substr(temp,1,4), "&FEB28"), ?? yymmdd8.);
return;
cards;
20080229 ok
20090229 should be changed to 28th
201XX229 this should be missing
20110229 -> 28
20120229 ok
20130229 -> 28
20270229 -> 28
;
run;
/* on log
temp=20080229 date=20080229
temp=20090229 date=20090228
temp=201XX229 date=.
temp=20110229 date=20110228
temp=20120229 date=20120229
temp=20130229 date=20130228
temp=20270229 date=20270228
NOTE: The data set WORK.ONE has 7 observations and 1 variables.
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)