sas日期格式

问题描述:

我想写一个SAS脚本,它将简单读入SAS .sas7bdat数据文件并以文本格式输出。我希望日期以YYYYMMDD格式输出。我不知道日期栏的名称是什么。目前我的脚本是:sas日期格式

libname tmplib '~/testdatadir/'; 
OPTIONS MISSING='00'x; 
data tmpdata; 
set tmplib.testdatafile; 
array flds{*} _NUMERIC_; 
do i=1 to dim(flds); 
    if missing(flds(i)) then flds(i)=.; 
end; 
array charflds{*} _CHARACTER_; 
do i=1 to dim(charflds); 
    if missing(charflds(i)) then charflds(i)=' '; 
end; 
drop i; 
RUN; 

PROC EXPORT 
    DATA = tmpdata 
    OUTFILE = 'testdataoutfile.txt' 
    DBMS = TAB REPLACE; 
    PUTNAME = YES; 
RUN; 

我要么想通过所有日期字段迭代(因为我NUMERIC领域和CHARACTER领域做的),或者增加一个检查每个NUMERIC现场测试是否它是一个日期(然后我可以更改格式),或者添加一个选项到PROC EXPORT以指示输出日期格式。获取输出文件的日期格式为YYYYMMDD的任何其他方法也是可以接受的。

+0

在您的数据中是否有指示变量是日期的内容?它是否已经格式化为日期?它是否有名称中的内容表明它是约会? –

您可以使用varfmt函数来查找数值变量的格式,它可以帮助您确定它是否为日期,即它的格式是否为日期格式。从技术上讲,你可能有一个日期不是正确的日期格式,所以它只显示为16239或其他东西,但这些很难检测,因为它也可能只是数字16,239。此方法将查找在数据浏览器中显示为日期的任何内容。

然后使用putinput的某种组合将其转换为YYYYMMDD格式。

仅仅使用put的一个问题是,我认为默认情况下它会返回一个字符变量,因此您需要创建一个新的字符变量来保存日期,或者将YYYYMMDD转换回8位数字编号,所以编号20120501而不是字符串20120501

对于example 2,您应该注意,varfmt返回给定数据集名称和变量编号的变量格式。在这个例子中,他们建立了一个单独的vars表,其目的是遍历所有的变量。

+3

VARFMT函数与SAS组件语言(SCL)一起使用,使语法更复杂。 VFORMAT功能在数据步骤中执行相同的任务,在这里可能会更容易。但是,检查返回的格式名称是多种日期格式之一还是有任务的! – Longfish

我建议改变变量格式。当变量格式没有改变时,使用put/input可能会导致错误的结果。例如,如果使用put/input将日期更改为年,但将变量格式保留为date9,则日期仍将作为date9(基础值为年)读取。如果您导出为CSV,日期将不正确。

这是一个简单的宏,它将检查所有变量并隔离日期,以便将其格式修改为年份。您需要指定哪些日期格式可以在您的数据集中(或创建比宏中的内容更详尽的列表),并对其进行修改以生成所需的数据格式。

%macro _toyear(dsin=,dsout=); 
/* proc contents will list all variables in the dataset, with formats */ 
proc contents data=&dsin out=_contents noprint; 
    run; 
data _contents; 
    set _contents (where=(format in: ("DATE", "MMDDYY", "MMYY"))); 
    run; 

/* use proc sql to create a macro variable with a list of the date variables */ 
proc sql noprint; 
    selet name into: datevars separated by " " from _contents; 
    quit; 

/* simple error checking, in case there are no date variables */ 
%let dsid = %sysfunc(open(_contents, is)); 
%let nlobs = %sysfunc(attrn(&dsid, nlobs)); 

/* output dataset */ 
data &dsout; 
    set &dsin; 
    %if &nlobs ne 0 %then %do; format &datevars year4.; %end; 
    run; 

/* clean-up */ 
%let rc = %sysfunc(close(&dsid)); 
proc datasets nolist; delete _contents; 
    run; 
%mend _toyear;