【发布时间】:2017-08-19 15:24:09
【问题描述】:
我正在编写 SAS 中的一段代码,旨在提取给定时间序列数据列中的最后一个非空值及其相应的日期,然后将它们插入到新数据集中。 SQL 似乎是迄今为止最简单的方法,所以这就是我一直在使用的方法。
我正在读取的数据集称为 rtchg1,它是从早期代码中的 .xlsx 电子表格导入的。它由一个日期变量和一堆时间序列变量组成。
data rtchg1;
set rtchg1;
where date between '1FEB1959'd and '1OCT1998'd;
run;
我要写入的表是 Forecasts,用一些简单的 SQL 创建:
PROC SQL ;
CREATE TABLE Forecasts
(Date date,
Forecast num);
run;
我之前对“日期”进行了更复杂的格式化,并遇到了同样的问题。如果我在这里做错了什么,请告诉我,任何关于如何改进我的代码的建议都非常感谢。
最后我一直在开发以下宏来提取数据:
%macro scoreprep(readtable,datevar,writetable);
%do i=1 %to 3;
%let currentvar=%scan(&periods,&i);
proc sql;
select &datevar, ¤tvar into :date1, :LEI
from &readtable
where ¤tvar 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,以便在没有太多等待时间的情况下对其进行测试,等等。这里的一切似乎都完美无缺,除了将日期变量插入表中。当我删除日期变量并仅输入 &LEI 时,它会将其写入预测表而没有任何问题。当我按原样运行代码时,出现以下错误:
错误:无效的日期/时间/日期时间常数“10/01/1968”d.
不确定从这里开始,无论我在哪里尝试转换宏变量的格式,似乎都没有正常工作。建议将不胜感激。此外,如果您在我的代码中看到任何您不喜欢的内容,请随时批评。我确实知道在 Excel 中执行此操作的更简单方法,但这种方法更有趣:)
【问题讨论】: