我有一个包含 100 列的数据集。更简单和更小的版本如下:
账户 | 预计结束日期 | 需要_日期 | 金额 | 接受日期 | 确认_日期 | 评论 |
---|---|---|---|---|---|---|
约翰 | 2024 年 1 月 15 日 | 2024 年 1 月 15 日 | 1000 | 等待接受 | ||
约翰 | 2024 年 1 月 23 日 | 2024 年 1 月 28 日 | 20000 | 2024 年 1 月 20 日 | 2024 年 1 月 22 日 | 已关闭 |
山姆 | 2023年12月25日 | |||||
彼得 | 2024 年 4 月 5 日 | 2024 年 4 月 12 日 | 350 | 2024 年 3 月 27 日 | 需要确认 |
该数据集大约有 30-35 列,其中包含各种日期,全部采用字符格式。我需要将它们全部转换为日期格式。 此外,带有日期信息的列数可以改变,即可以有新的添加或删除。
我知道:
data want;
set database;
format temp mmddyy10.;
temp = input(Anticipated_Close_Date, mmddyy10.);
drop Anticipated_Close_Date;
rename temp = Anticipated_Close_Date;
将为我提供所需的格式。我还确定了所有包含“日期”的列:
proc contents data = database out= contents noprint; run;
proc sql;
select name into :varlist seperated by ' '
from contents
where name like '%Date%';
quit;
我不知道如何将它们结合起来并在整个数据集上运行它。我的猜测是我们需要迭代每一列并检查该列是否是“varlist”的一部分,如果为真,则使用输入函数。 请帮忙。
您可以使用
:varlist
指定 DATA Step 数组的元素并循环遍历该数组。您将需要更多的 SQL :into 来创建转换和重命名所需的其他代码片段。
示例:
名为*Date*的变量是字符串,将字符串转换为SAS日期值后应使用相同的名称。
proc contents data = database out= contents noprint; run;
proc sql;
select
cats(name,'=_',varnum)
, cats('_',varnum)
, cats(name)
into
:rename_in separated by ' '
:temp_date_vars separated by ' '
:date_vars separated by ' '
from contents
where name like '%Date%';
quit;
data want ;
set database (rename=&rename_in) ;
array tempdates &temp_date_vars ;
array dates &date_vars ;
do over dates ;
dates = input(tempdates,mmddyy10.) ;
end ;
format &date_vars mmddyy10. ;
run;