我是SAS新手,想知道如何最有效地列出开始日期和结束日期之间的月份和年份,以及开始日期和结束日期本身。我已经了解了INTCK和INTNX函数,时间序列数据的EXPAND函数,甚至CALENDAR FILL,但我不确定如何将它们用于此特定目的。由于拖放自动填充功能,使用Excel中的小数据集可以轻松完成此任务,但由于数据集的大小,我需要在SAS中找到一种方法。任何建议将不胜感激。谢谢!
数据集位于现在这样组织的大型文本文件中:
ID Start End
1000 08/01/2012 12/31/2012
1001 07/01/2010 05/31/2011
1002 04/01/1990 10/31/1991
但输出最终应该是这样的:
ID MonthYear
1000 08/12
1000 09/12
1000 10/12
1000 11/12
1000 12/12
1001 07/10
1001 08/10
1001 09/10
1001 10/10
1001 11/10
1001 12/10
1001 01/11
1001 02/11
1001 03/11
1001 04/11
1001 05/11
1002 04/90
1002 05/90
1002 06/90
1002 07/90
1002 08/90
1002 09/90
1002 10/90
1002 11/90
1002 12/90
1002 01/91
1002 02/91
1002 03/91
1002 04/91
1002 05/91
1002 06/91
1002 07/91
1002 08/91
1002 09/91
1002 10/91
答案 0 :(得分:5)
data want2;
set have;
do i = 0 to intck('month',start,end);
monthyear=intnx('month',start,i,'b');
output;
end;
format monthyear monyy.;
keep id monthyear;
run;
答案 1 :(得分:1)
这样就可以了。 PROC EXPAND可能更有效率,但我认为它需要一些期望的观察而不是开始/结束组合(尽管你可以得到它,我想)。
data have;
informat start end MMDDYY10.;
input ID Start End;
datalines;
1000 08/01/2012 12/31/2012
1001 07/01/2010 05/31/2011
1002 04/01/1990 10/31/1991
;;;;
run;
data want;
set have;
format monthyear MMYYS5.; *formats the numeric monthyear variable with your desired format;
monthyear=start; *start with the initial observation;
output; *output it;
do _t = 1 by 1 until (month(monthyear)=month(end)); *iterate until end;
monthyear = intnx('month',monthyear,1,'b'); *go to the next start of month;
output; *output it;
end;
run;