如何在SAS数据集中按行计算指定列的最小、最大日期及日期差
SAS行内日期极值计算与差值求解方案
给定如下SAS数据集:
data have; input subjid var1$ var2$ var3$ var4$ var5$ var6$; datalines; 121 23jan2022 24jan2022 20jan2022 24jan2022 26jan2022 25jan2022 122 20jan2022 22jan2022 26jan2022 28jan2022 23jan2022 27jan2022 ; run;
需求为:按行计算var1至var3的最小日期、var4至var6的最大日期,再求两个日期的天数差值(第一行预期差值为6天)。
解决方案代码
data want; set have; /* 定义数组存储待处理的字符型日期变量 */ array char_dates1[3] $ var1-var3; array char_dates2[3] $ var4-var6; /* 临时数组存储转换后的SAS日期型变量,不保留到输出数据集 */ array sas_dates1[3] _temporary_; array sas_dates2[3] _temporary_; /* 将字符日期转换为SAS数值型日期(date9.格式匹配输入的DDMONYYYY格式) */ do i = 1 to 3; sas_dates1[i] = input(char_dates1[i], date9.); sas_dates2[i] = input(char_dates2[i], date9.); end; /* 计算两组日期的极值 */ min_date = min(of sas_dates1[*]); max_date = max(of sas_dates2[*]); /* 计算天数差值:SAS日期为数值型,直接相减得到天数 */ date_diff = max_date - min_date; /* 格式化日期变量为可读格式 */ format min_date max_date date9.; drop i; run;
代码说明
- 日期转换:使用
input()函数将字符型日期转为SAS内部数值型日期(date9.格式适配输入的DDMONYYYY格式) - 数组处理:通过数组批量处理多列变量,避免重复编写转换逻辑,提升代码简洁性
- 极值计算:
min(of sas_dates1[*])和max(of sas_dates2[*])直接对数组内所有元素求极值,无需逐行判断 - 差值计算:SAS日期以"天"为单位存储为数值,直接相减即可得到天数差
验证结果
- 第一行:
min_date=20JAN2022,max_date=26JAN2022,date_diff=6(符合预期) - 第二行:
min_date=20JAN2022,max_date=28JAN2022,date_diff=8
内容的提问来源于stack exchange,提问作者MNU
相关产品推荐
相关产品推荐

