我正在尝试循环一系列日期以创建其间的日期。这将以月份为单位进行,始终显示相应月份的最后一天。给出了开始日期和结束日期(first_date 和 last_date),而 last_date 应始终指上个月的月底。
原始数据集如下所示:
customer id first_date last_date
xy 135 01.01.2000 25.03.2005
xy 247 19.03.2003 25.03.2005
ab 387 01.06.2010 30.12.2012
ab 128 01.05.2010 28.02.2011
...
我的目标是拥有一个如下所示的数据集:
customer id date
xy 135 31.01.2000
xy 135 28.02.2000
...
xy 135 28.02.2005
xy 247 31.03.2003
xy 247 30.04.2003
...
xy 247 28.02.2005
我发现迭代几天的解决方案非常简单(见下文),但我正在努力实现每月步骤和月末日期。
data want;
set have;
by customer id;
do day = first_date to last_date;
output;
end;
format day date9.;
run;
感谢您的帮助!!
最佳答案
首先,让我们获取一些数据:
data have;
attrib customer length=$10 informat=$10.
id informat=best.
first_date informat=ddmmyy10. format=ddmmyy10.
last_date informat=ddmmyy10. format=ddmmyy10.
;
input customer $
id
first_date
last_date
;
datalines;
xy 135 01.01.2000 25.03.2005
xy 247 19.03.2003 25.03.2005
ab 387 01.06.2010 30.12.2012
ab 128 01.05.2010 28.02.2011
;
run;
intnx()
函数将在这里发挥作用。我们将创建一个名为 date 的新变量,然后使用 intnx 函数返回该日期的月底。只要该日期小于结束日期,我们就会继续将其输出到数据集,然后递增到下个月月底。
data want;
format date ddmmyy10.;
set have;
date = intnx('month',first_date,0,'end');
do while (date le last_date);
output;
date = intnx('month',date,1,'end');
end;
drop first_date last_date;
run;
关于loops - sas 从变量循环一个月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33760053/