SAS日期跟踪
我有以下数据集,如果到期日-后续发行日期介于0和1之间,我希望获得展期交易的最终到期日,然后将其视为展期交易。 请告知如何在SAS中编写编码,以从到期日获取最终到期日_1SAS日期跟踪,sas,Sas,我有以下数据集,如果到期日-后续发行日期介于0和1之间,我希望获得展期交易的最终到期日,然后将其视为展期交易。 请告知如何在SAS中编写编码,以从到期日获取最终到期日_1 Number Amount Issue_Date Maturity_Date Maturity date_1 Remarks 1 10000 29-Sep-16 28-Oct-16 24-Apr-17 Roll over 2 10000 28-Oct-16
Number Amount Issue_Date Maturity_Date Maturity date_1 Remarks
1 10000 29-Sep-16 28-Oct-16 24-Apr-17 Roll over
2 10000 28-Oct-16 28-Nov-16 Roll over from 1
3 10000 28-Oct-16 28-Nov-16 28-Nov-16 Distinct Transaction
4 10000 28-Nov-16 29-Dec-16 Roll over from 2
5 10000 29-Dec-16 27-Jan-17 Roll over from 4
6 10000 26-Jan-17 27-Feb-17 Roll over from 5
7 10000 27-Feb-17 24-Mar-17 Roll over from 6
8 10000 24-Mar-17 24-Apr-17 Roll over from 7
提前感谢您可以在单个数据步骤中完成此操作;使用保留功能。 在我下面的解决方案中: 我保留了上一条记录的值来计算0或1, 最后,我将最终到期日保存在一个宏变量中,然后仅更新第一条记录。 解决方案: 数据准备和格式:
data have;
length number 8. Amount 8. Issue_Date $9. Maturity_Date $9. ;
input Number Amount Issue_Date $ Maturity_Date $ ;
datalines;
1 10000 29-Sep-16 28-Oct-16
2 10000 28-Oct-16 28-Nov-16
3 10000 28-Oct-16 28-Nov-16
4 10000 28-Nov-16 29-Dec-16
5 10000 29-Dec-16 27-Jan-17
6 10000 26-Jan-17 27-Feb-17
7 10000 27-Feb-17 24-Mar-17
8 10000 24-Mar-17 24-Apr-17
;
run;
proc sql;
create table have_dates as select
number, amount,input(Issue_Date,date9.)as Issue_Date format=date9., input(Maturity_Date,date9.) as Maturity_Date format=date9.,
. as Maturity_date_1 format=date9. ,"" as Remarks length=20 format=$20.
from have
;
quit;
逻辑:
data want;
set have_dates end=eof;
retain Issue_prv;
retain maturity_prv;
retain number_prv;
if _n_ = 1 then do;
Issue_prv=Issue_Date;
maturity_prv=Maturity_Date;
number_prv=number;
output;
end;
if _n_ > 1 then do;
if (issue_date = Issue_prv and Maturity_Date=maturity_prv)
then do; Remarks="Distinct Transaction"; Maturity_date_1=Maturity_Date; end;
if (intck('Day',Issue_Date,maturity_prv) = 0 or intck('Day',Issue_Date,maturity_prv)= 1)
then do; Remarks=catx(" ","Roll over from ",number_prv); number_prv=number;end;
if (eof and Remarks ne "") then do ; final=Maturity_Date; call symput("final_maturity",Maturity_Date); end ;
output;
Issue_prv=Issue_Date;
maturity_prv=Maturity_Date;
end;
format Issue_prv maturity_prv final date9.;
keep number amount Issue_Date Maturity_Date Maturity_date_1 Remarks;
run;
proc sql;
update want
set Maturity_date_1= &final_maturity. , Remarks="Roll over"
where Remarks="";
quit;
输出:
为什么4是2的延续而不是3的延续?4可以是2或3的延续。为什么我链接2到4,因为我想知道,如果两个事务之间存在间隙,是否有可能链接下一个事务。