SAS代码中的;日期“;

SAS代码中的;日期“;,sas,Sas,我在SAS中遇到过以不同方式处理的代码 “日期”。然而,我不明白上一个“格式”在这里做什么。 代码如下 DATA SASWEEK.Datestest; INPUT d1 MMDDYY8. +1 d2 DATE9.; * informat does; * Can be replaced by an informat statement; d1f = d1; d2f= d2; d3f = d2; FORMAT d1f DATE9. d2f WORDDATE. d3

我在SAS中遇到过以不同方式处理的代码 “日期”。然而,我不明白上一个“格式”在这里做什么。 代码如下

    DATA SASWEEK.Datestest;
  INPUT d1 MMDDYY8. +1 d2 DATE9.;
  * informat does;
  * Can be replaced by an informat statement;
  d1f = d1;
  d2f= d2;
  d3f = d2;
  FORMAT d1f DATE9. d2f WORDDATE. d3f MMDDYY8.; *formats;
  datalines;

01111960 12JAN1960
01011961 01MAR2013
;

PROC PRINt;
RUN;

PROC PRINT;
   FORMAT d1f 9.0 d1 WEEKDATE.;
RUN;

任何建议和解释都将不胜感激

我不确定您是否将
proc print
中的格式称为
格式d1f 9.0 d1工作日,或数据步骤中的最后一种格式
格式d1f DATE9。d2f字日期。d3f-MMDDYY8

无论哪种方式,格式都只会影响数据的显示方式,而不会更改保存的值,在您的情况下,保存的值只是数字,因为日期存储为数字

SAS日期从1960年1月1日的
0开始,然后从1960年1月2日的
1开始,依此类推。这就是为什么在第一次观察的
proc print
输出中可以看到
10
11
等值,第二次观察遵循相同的计数顺序

重申一下,格式只是影响显示,而不是值

编辑 针对评论中的问题:

根据你的解释,最后一个“D1F9.0”是从 01/11/60->“01111960”

你的问题的简短答案是“不”,解释如下

d1f
的第一次观察是基于1960年1月11日的输入数据
01111960
,以及SAS计算天数时的天数
10
(如我最初的回答中所述)

变量
d1f
包含第一次观察的值
10

d1f
的格式为
DATE9。
在初始数据步骤中应用于它,因此第一个
proc print
11JAN1960
显示为
d1f
的第一个值

第二个
proc print
将格式
9.0
应用于
d1f
的值,这指示SAS在9列(小数点后0位)内显示
d1f
(值为
10
)的值,这就是为什么在第二个
proc print
中,
10
显示为
d1f
的第一个值

以下数据步骤也可能有助于演示如果在代码之后运行它并检查日志中的结果会发生什么:

data _null_;
   set SASWEEK.Datestest;
   put d1f;
   put d1f 9.0;
   put d1f 8.0;
   put d1f 7.0;
   put d1f 6.0;
   put d1f 5.0;
   put d1f 4.0;
   put d1f 3.0;
run;

你是说上一个与PROC PRINT一起使用的format语句吗?是的,最后一个format语句我指的是最后一个format语句,我不明白“d1f 9.0”在这里做什么。因此,根据您的解释,最后一个“d1f 9.0”是从60年11月1日开始制作d1f->“01111960”?请参阅相关的“编辑”以了解我的回答。