英文:
Proq sql query in SAS
问题
我有一个包含ID和日期的表格,看起来像这样:
IDs | 开始日期 | 结束日期 |
---|---|---|
1 | 202105 | 202107 |
2 | 202201 | 202205 |
3 | 202101 | 202301 |
我需要输出所有日期,以月为单位均匀递增(使用日期格式date6.),以便我可以将输出表格用于进一步的连接。
IDs | 新日期 |
---|---|
1 | 202105 |
1 | 202106 |
1 | 202107 |
2 | 202201 |
2 | 202202 |
2 | 202203 |
2 | 202204 |
2 | 202205 |
. | |
. |
使用SAS的PROC SQL
或DATA STEP
,您可以使用DO
循环来实现这个目标。以下是使用DATA STEP
的示例代码:
data output_table;
set your_input_table;
format New_Date date6.;
do New_Date = Start_Date to End_Date;
output;
end;
run;
上述代码会为每个ID生成从Start_Date到End_Date的所有日期,并将它们输出到新表output_table中。请将"your_input_table"替换为您的实际输入表格的名称。
这种方法是简单且有效的方式来实现您的需求。如果需要更多高级的日期处理,可以考虑使用SAS的日期函数来进行操作。
英文:
I have a table with IDs and dates which looks like
|IDs|Start_Date|End_Date|
|---|----------|--------|
|1|202105|202107|
|2|202201|202205|
|3|202101|202301|
And I need the output with all the dates in between basically uniformly incremented BY MONTH (format date6.) so that I can use the output table for further joins.
|IDs|New_Date|
|---|--------|
|1|202105|
|1|202106|
|1|202107|
|2|202201|
|2|202202|
|2|202203|
|2|202204|
|2|202205|
.
.
What kind of functions would let me do that in the most simplest and efficient way using either proq sql or data step in SAS?
Was thinking of trying loops in data step or INTCK function.
答案1
得分: 0
如果您想要增加日期/时间/日期时间值,而不是它们存储的单位(天/秒/秒),则可以使用INTNX()和偏移计数器的组合。要计算间隔的数量,请使用INTCK()函数。
所以要在START和END之间的每个月生成一个观察结果,您可以使用以下代码。
data want ;
set have;
do offset=0 to intck('month',start,end);
date = intnx('month',start,offset);
output;
end;
format date date9.;
run;
这段代码会在want
数据集中生成每个月的观察结果,其中start
和end
是您的起始和结束日期,date
列包含生成的日期,使用date9.格式进行格式化。
英文:
If you want to increment date/time/datetime values by something other than the units (days/seconds/seconds) they are stored in then use a combination of INTNX() and an offset counter. To calculate the number of intervals use the INTCK() function.
So to generate one observation for every month between START and END you could use.
data want ;
set have;
do offset=0 to intck('month',start,end);
date = intnx('month',start,offset);
output;
end;
format date date9.;
run;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论