SAS:使用 PROC SQL 将日期变量写入 SAS 数据集

SAS: Using PROC SQL to write a date variable into a SAS dataset

我正在使用 SAS 编写一段代码,旨在提取给定时间序列数据列中的最后一个非空值及其对应的日期,然后将它们插入到新数据集中。 SQL 似乎是迄今为止最简单的方法,所以这就是我一直在使用的方法。

我正在读取的数据集称为 rtchg1,它是从早期代码中的 .xlsx 电子表格导入的。它由一个日期变量和一堆时间序列变量组成。

data rtchg1;
set rtchg1;
where date between '1FEB1959'd and '1OCT1998'd;
run;

我要写信给的 table 是 Forecasts,它是用一些简单的 SQL:

创建的
PROC SQL ;
    CREATE TABLE Forecasts
    (Date date,      
     Forecast num);
run;    

我之前对 'Date' 进行了更复杂的格式化并遇到了同样的问题。不过,如果我在这里做错了什么,请告诉我,如有任何关于如何改进我的代码的建议,我们将不胜感激。

最后,我开发了以下宏来提取数据:

%macro scoreprep(readtable,datevar,writetable); 
%do i=1 %to 3;

    %let currentvar=%scan(&periods,&i);

    proc sql;
        select &datevar, &currentvar into :date1, :LEI
        from &readtable
        where &currentvar is not null
        having &datevar=max(&datevar);

        insert into &writetable (Date, Forecast)
            values ("&date1"d, &LEI);
    quit;

%end;
%mend;

%scoreprep(rtchg1,date,Forecasts); 

它现在只从 1 到 3,以便在没有太多等待时间的情况下对其进行测试等。除了将日期变量插入 table 之外,这里的一切似乎都运行良好。当我删除日期变量并仅输入 &LEI 时,它会毫无问题地将其写入 Forecasts table。当我按原样 运行 代码时,出现以下错误:

错误:无效 date/time/datetime 常量“10/01/1968”d.

不太确定从这里继续到哪里,无论我在哪里尝试转换宏变量的格式,似乎都无法正常工作。建议将不胜感激。另外,如果您按原样在我的代码中看到任何您不喜欢的地方,请随时批评。我在 Excel 知道更简单的方法,但这种方法更有趣 :)

尝试像这样更改此行,看看是否有帮助:

    select &datevar format=date9., &currentvar into :date1, :LEI

由于您要将值提取到字符串中,因此您需要告诉 SAS 如何将该字符串转换回日期。明确说明您是如何进行转换的。首先生成宏变量,然后生成 VALUES() 语句。因此,如果 Forecast 是一个数字,那么这应该只损失最小的精度。

select put(&datevar,date9.) ,put(&currentvar,best32.) into :date1 ,:LEI
...
values ("&date1"d, &LEI)

但如果它是一个字符变量,那么您可能想使用它。

select put(&datevar,date9.), quote(&currentvar) into :date1,:LEI
...
values ("&date1"d, &LEI)

还要确保您用作 DATE 源的变量实际上具有 DATE 值而不是 DATETIME 值。如果它具有 DATETIME 值,那么您可以使用 DTDATE 格式以正确的格式生成宏变量。或者使用 datepart() 函数只提取日期值。

请注意,将数据放入宏变量中只是为了稍后可以将其放回数据中是没有意义的。所以你可以使用 PROC APPEND。

%macro scoreprep(readtable,datevar,writetable);
%local currentvar i ;
%do i=1 %to %sysfunc(countw(&periods));
  %let currentvar=%scan(&periods,&i);
proc sql;
  create table to_add as
    select &datevar as date 
         , &currentvar as forecast
    from &readtable
    where &currentvar is not null
    having &datevar=max(&datevar)
  ;
quit;
proc append data=to_add base=&writetable force ;
run;

%end;
%mend;

%scoreprep(rtchg1,date,Forecasts);

或者甚至只是使用 SQL 代码来插入查询结果。

insert into &writetable (date,forecast)
  select &datevar, &currentvar
    from &readtable
    where &currentvar is not null
    having &datevar=max(&datevar)
;