如何将 SAS table 中的所有 DATETIME 变量转换为 DATE9
How to convert all DATETIME variables in a SAS table to DATE9
我在 SAS 中有一个 table,其中代表日期的所有变量都在 DATETIME20 中。格式,我想将它们转换为 DATE9。格式。假设我的 SAS table(date1、date2、date3)中有 3 个日期时间变量,我想将它们转换为 DATE9。同时保留其原始名称(date1、date2、date3)。我希望代码灵活,这样如果我更改变量名称 - 在代码的序言中更改 (date1, date2, date3) 的名称 - 那么代码仍然有效,即我希望代码适用于不同的名称以及这些日期变量的数量。我在 SAS 中有这段代码:
%let dates = ('date1', 'date2', 'date3');
data my_table;
set my_table;
array numvars _NUMERIC_;
do _t = 1 to dim(numvars);
if upcase(vname(numvars[_t])) in &dates. then do;
numvars[_t] = datepart(numvars[_t]);
end;
end;
run;
但是,这不会将我的 (date1, date2, date3) 变量转换为 DATE9。但在此转换之后,它们仍然是具有不正确值的 DATETIME 变量。我希望能够更改 &dates。第一行的宏变量,这样我就不必更改该行之后的代码。
除了将存储的值从秒更改为天(通过使用 DATEPART() 函数)之外,您还需要更改用于显示值的格式。使宏变量只包含变量名列表,以便它可以在 SAS 代码中使用。
%let dates = date1 date2 date3 ;
data my_table;
set my_table;
array dtvars &dates ;
do _t = 1 to dim(dtvars);
dtvars[_t] = datepart(dtvars[_t]);
end;
format &dates date9.;
run;
如果您想使其更加动态,则使用 FMTINFO() 函数查找现有的 DATETIME 变量。 FMTINFO() 函数只需要格式名称而不需要完整的格式规范,因此使用 PROC CONTENTS 的输出比使用字典视图更容易。
%let dsnin=example;
%let dsnout=example_date;
proc contents data=&dsnin noprint out=contents; run;
proc sql noprint;
select nliteral(name)
into :varlist separated by ' '
from contents
where fmtinfo(format,'cat')='datetime'
;
%let nvars=&sqlobs;
quit;
data &dsnout;
set &dsnin;
%if &nvars %then %do;
array _dt &varlist ;
do over _dt; _dt = datepart(_dt); end;
format &varlist date9.;
%end;
run;
您甚至可以更改 SQL 查询以仅测试您放入 DATES 宏变量中的特定变量。
where fmtinfo(format,'cat')='datetime'
and findw("&dates",name,' ','sit')
我在 SAS 中有一个 table,其中代表日期的所有变量都在 DATETIME20 中。格式,我想将它们转换为 DATE9。格式。假设我的 SAS table(date1、date2、date3)中有 3 个日期时间变量,我想将它们转换为 DATE9。同时保留其原始名称(date1、date2、date3)。我希望代码灵活,这样如果我更改变量名称 - 在代码的序言中更改 (date1, date2, date3) 的名称 - 那么代码仍然有效,即我希望代码适用于不同的名称以及这些日期变量的数量。我在 SAS 中有这段代码:
%let dates = ('date1', 'date2', 'date3');
data my_table;
set my_table;
array numvars _NUMERIC_;
do _t = 1 to dim(numvars);
if upcase(vname(numvars[_t])) in &dates. then do;
numvars[_t] = datepart(numvars[_t]);
end;
end;
run;
但是,这不会将我的 (date1, date2, date3) 变量转换为 DATE9。但在此转换之后,它们仍然是具有不正确值的 DATETIME 变量。我希望能够更改 &dates。第一行的宏变量,这样我就不必更改该行之后的代码。
除了将存储的值从秒更改为天(通过使用 DATEPART() 函数)之外,您还需要更改用于显示值的格式。使宏变量只包含变量名列表,以便它可以在 SAS 代码中使用。
%let dates = date1 date2 date3 ;
data my_table;
set my_table;
array dtvars &dates ;
do _t = 1 to dim(dtvars);
dtvars[_t] = datepart(dtvars[_t]);
end;
format &dates date9.;
run;
如果您想使其更加动态,则使用 FMTINFO() 函数查找现有的 DATETIME 变量。 FMTINFO() 函数只需要格式名称而不需要完整的格式规范,因此使用 PROC CONTENTS 的输出比使用字典视图更容易。
%let dsnin=example;
%let dsnout=example_date;
proc contents data=&dsnin noprint out=contents; run;
proc sql noprint;
select nliteral(name)
into :varlist separated by ' '
from contents
where fmtinfo(format,'cat')='datetime'
;
%let nvars=&sqlobs;
quit;
data &dsnout;
set &dsnin;
%if &nvars %then %do;
array _dt &varlist ;
do over _dt; _dt = datepart(_dt); end;
format &varlist date9.;
%end;
run;
您甚至可以更改 SQL 查询以仅测试您放入 DATES 宏变量中的特定变量。
where fmtinfo(format,'cat')='datetime'
and findw("&dates",name,' ','sit')