【问题标题】:How to create additional rows for each day between two dates in SAS?如何在 SAS 中的两个日期之间的每一天创建额外的行?
【发布时间】:2026-01-23 05:50:01
【问题描述】:

我正在寻找 SAS 代码来为两个日期之间的每一天创建“新”行。 例如。我的原始数据集包含:

Num. StartDate EndDate  Tag
5      13JUN2017 25NOV2017  1
6      1JAN2017 4MAR2017   5 
...

等等。我需要用

转置这个数据集
Num. Day           TAG
5      13JUN2017     1
5      14JUN2017     1
... 
5      25NOV2017     1
6      1JAN2017      5
...
6      4MAR2017      5
...

有人可以帮忙吗? 提前致谢!

【问题讨论】:

  • 已经找到了!
  • 将该发现放入下面的答案中,然后接受它。然后我们不会期待有人仍然需要帮助来解决这个问题。请这样做。寻找它的其他人也可能会感谢您。

标签: loops date sas transform


【解决方案1】:

尝试使用 do while

data have;
input num startdate enddate tag;
informat startdate date9. enddate date9.;
format startdate date9. enddate date9.;
cards;
5 13jun2017 25nov2017 1
6 01jan2017 04mar2017 5
;
run;

data want; 
set have;
format next_due_date date9.;
next_due_date = startdate;
do while (enddate > next_due_date);
next_due_date = intnx("day",next_due_date,1);   
output;
end;
run;

如有任何疑问,请告诉我。

【讨论】:

  • 由于 SAS 将日期存储为整数,因此您只需使用简单的 do next_due_date=startdate to enddate; 循环即可。但是,如果您想按日期间隔而不是day 递增,则 do while 循环很有用。
  • @tom 如果我想按日期以外的日期间隔递增,即使这样我也可以通过简单地给出“by”语句来使用“do”。 “do & do while”都可以用于两个查询(按天递增以及时间间隔递增)。不是吗?
  • @pinegulf 乐于助人!!