如何通过年份与周数获取每周的周一起始及周日结束日期?
从年份和周数计算周起始(周一)和结束(周日)日期
问题背景
现有数据集包含拆分后的year(4位年份)和week(周数,如04、51)列,需要计算每周的周一(Week_start_date)和周日(Week_end_date),每周以周一为起始。示例数据如下:
| ID | YYWW | year | week | Week_start_date | Week_end_date |
|---|---|---|---|---|---|
| 1 | 1504 | 2015 | 04 | ? | ? |
| 2 | 1651 | 2016 | 51 | ? | ? |
| 3 | 1251 | 2012 | 51 | ? | ? |
| 4 | 1447 | 2014 | 47 | ? | ? |
多数搜索资源聚焦于从日期反推周数,反向需求的可行方案较少,以下提供SAS环境下的实现方案:
SAS解决方案
利用SAS的INTNX函数指定周起始为周一,结合年份计算目标日期,代码如下:
data want; set have; /* 转换字符型周数为数值(若原week为数值可跳过此步) */ week_num = input(week, 2.); /* 计算周起始(周一):基于当年1月1日,调整到指定周的周一 */ Week_start_date = intnx('week.2', mdy(1,1,year), week_num-1, 'b'); /* 计算周结束(周日):起始日期加6天 */ Week_end_date = Week_start_date + 6; /* 格式化日期为易读格式 */ format Week_start_date Week_end_date date9.; run;
代码说明
week.2:明确指定周的起始为周一(SAS默认周日为周起始,week.1对应周日,week.2对应周一)mdy(1,1,year):生成当年1月1日的日期值intnx('week.2', ..., week_num-1, 'b'):从当年1月1日开始,向后偏移week_num-1个完整周,'b'参数取该周期的起始边界(即周一)- 周结束日期直接通过起始日期加6天得到,无需额外函数计算
示例验证结果
对给出的示例数据,计算后结果如下:
- ID1(2015年第4周):起始日期
26JAN2015,结束日期01FEB2015 - ID2(2016年第51周):起始日期
12DEC2016,结束日期18DEC2016 - ID3(2012年第51周):起始日期
10DEC2012,结束日期16DEC2012 - ID4(2014年第47周):起始日期
17NOV2014,结束日期23NOV2014
注意事项
- 若原
week列是字符型(如'04'),必须先通过input函数转换为数值型再计算 - 若需符合ISO周标准(周一起始,且每年至少有4天在当年),可将
week.2替换为weeku.2,weeku是SAS中ISO周的标识
内容的提问来源于stack exchange,提问作者drdrnissen
相关产品推荐
相关产品推荐

