尝试确定清理日期(字符)的合理方法,然后通过input
函数将这些日期放在正确的日期格式中,但是一旦保存了合理的变量名称(甚至可能保留原始变量名称)执行char-to-number进程。
正在使用数组清理日期(将'..'
替换为'01'
,或将'....'
替换为0101
),因为大约有75个变量将日期作为字符串。
实施例。 -
data sample;
input d1 $ d2 $ d3 $ d4 $ d5 $;
cards;
200103.. 20070905 20060222 2007.... 199801..
;
run;
data clean;
set sample;
array dt_cln(5) d1-d5;
array fl_dt (5) f1-f5;
*clean out '..'/'....', replace with '01'/'0101';
do i=1 to 5;
if substr(dt_cln(i),5,4) = '....' then do;
dt_cln(i) = substr(dt_cln(i),1,4) || '0101';
end;
else if substr(dt_cln(i),7,2) = '..' then do;
dt_cln(i) = substr(dt_cln(i),1,6) || '01';
end;
end;
*change to number;
do i=1 to 5;
fl_dt(i)=input(dt_cln(i),yymmdd8.);
end;
format f: date9.;
drop i d:;
run;
最好的方法是什么?
答案 0 :(得分:1)
您不能保留原始名称并直接从字符转换为数字 - 但是,使用一些宏代码,您可以删除所有旧字符变量并重命名您创建的数字版本。 E.g。
%macro rename_loop();
%local i;
%do i = 1 %to 5;
f&i = d&i
%end;
%mend;
然后在您的数据步骤中,在drop语句后面添加一个重命名语句:
rename %rename_loop;
否则,您现有的方法已经相当不错了。您可以稍微简化清洁过程,例如删除第一个do-loop并在第二个中执行以下操作:
fl_dt(i)=input(tranwrd(dt_cln(i),'..','01'),yymmdd8.);
答案 1 :(得分:0)
data want;
set sample;
array var1 newd1-newd5;
array var2 d:;
do over var2;
var1=input(ifc(index(var2,'.')^=0,put(prxchange('s/((\.){1,})/0101/',-1,var2),8.),var2),yymmdd8.);
end;
format newd1-newd5 yymmddn8.;
drop d:;
run;