【问题标题】:sas date formatsas日期格式
【发布时间】:2012-05-11 04:51:50
【问题描述】:

我正在尝试编写一个 SAS 脚本,该脚本将简单地读取 SAS .sas7bdat 数据文件并以文本格式输出。我希望日期以 YYYYMMDD 格式输出。我不知道日期列的名称是什么。我的脚本目前是:

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 的方法也是可以接受的。

【问题讨论】:

  • 您的数据中是否有某些内容表明变量是日期?它是否已经格式化为日期?它的名称中有什么东西表明它是一个日期吗?

标签: sas


【解决方案1】:

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

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

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

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

【讨论】:

  • VARFMT 函数与 SAS 组件语言 (SCL) 一起使用,使语法更加复杂。 VFORMAT 函数在数据步骤中执行相同的任务,在这里可能会更容易。但是,仍然需要检查返回的格式名称是否是众多日期格式之一!
【解决方案2】:

我建议改为更改变量格式。在不改变变量格式的情况下,使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多