在两个日期范围之间创建虚拟日期记录

Creating dummy date records between two date ranges

您好,我需要为每个 subjid 创建虚拟日期记录。因此,例如 10001 开始日期 (ASTDT) 是 01DEC2019,结束日期 (AENDT) 是 03DEC2019,所以我需要为该主题 ID 创建 02DEC2019 的虚拟记录。我假设这可能需要在某个时候进行 proc 转置,我已经看到了具有类似逻辑的相关代码,但不完全是我需要的

data want;
set have;
by account;

output;

if last.account then do;
    /*Current month as a number*/
    month_n = month(input(catt("01",strip(month),"2000"),date9.));
    /*LastMonth as a number*/
    to_month = month(input(catt("01",lastMonth,"2000"),date9.));

    do i=month_n+1 to to_month;
        month = put(mdy(i,1,2000),monname3.); /*Increment the month and write the month name*/
        output;
    end;
end;

drop month_n to_month i;
run;

这是期望的输出


100001 01DEC2019 03DEC2019
100001 02DEC2019 03DEC2019
100001 03DEC2019 03DEC2019
100002 30JAN2020 31JAN2020
100002 31JAN2020 31JAN2020
100002 31JAN2020 02FEB2020
100002 01FEB2020 02FEB2020
100002 02FEB2020 02FEB2020
100002 31JAN2020 31JAN2020
100003 24FEB2020 24FEB2020
100003 21FEB2020 22FEB2020
100003 22FEB2020 22FEB2020

首先,让我们假设您的数据如下所示。

您想要的结果是什么样的?

data have;
input subjid $ (ASTDT AENDT)(:date9.);
format ASTDT AENDT date9.;
datalines;
100001 01DEC2019 03DEC2019
100002 30JAN2020 31JAN2020
100002 31JAN2020 02FEB2020
100002 31JAN2020 31JAN2020
100003 24FEB2020 24FEB2020
100003 21FEB2020 22FEB2020
;

看看这是否满足您的需求

data have;
input subjid $ (ASTDT AENDT)(:date9.);
format ASTDT AENDT date9.;
datalines;
100001 01DEC2019 03DEC2019
100002 30JAN2020 31JAN2020
100002 31JAN2020 02FEB2020
100002 31JAN2020 31JAN2020
100003 24FEB2020 24FEB2020
100003 21FEB2020 22FEB2020
;

data want;
   set have;
   do ASTDT = ASTDT to AENDT;
      output;
   end;
run;

结果:

Obs subjid ASTDT     AENDT 
1   100001 01DEC2019 03DEC2019 
2   100001 02DEC2019 03DEC2019 
3   100001 03DEC2019 03DEC2019 
4   100002 30JAN2020 31JAN2020 
5   100002 31JAN2020 31JAN2020 
6   100002 31JAN2020 02FEB2020 
7   100002 01FEB2020 02FEB2020 
8   100002 02FEB2020 02FEB2020 
9   100002 31JAN2020 31JAN2020 
10  100003 24FEB2020 24FEB2020 
11  100003 21FEB2020 22FEB2020 
12  100003 22FEB2020 22FEB2020 
data want(drop = ASTDT);
   format subjid dt AENDT;
   set have;
   do dt = ASTDT to AENDT;
      dummy = not (dt = ASTDT | dt = AENDT);
      output;
   end;
   format dt date9.;
run;

结果:

Obs subjid dt        AENDT     dummy 
1   100001 01DEC2019 03DEC2019 0 
2   100001 02DEC2019 03DEC2019 1 
3   100001 03DEC2019 03DEC2019 0 
4   100002 30JAN2020 31JAN2020 0 
5   100002 31JAN2020 31JAN2020 0 
6   100002 31JAN2020 02FEB2020 0 
7   100002 01FEB2020 02FEB2020 1 
8   100002 02FEB2020 02FEB2020 0 
9   100002 31JAN2020 31JAN2020 0 
10  100003 24FEB2020 24FEB2020 0 
11  100003 21FEB2020 22FEB2020 0 
12  100003 22FEB2020 22FEB2020 0