SAS 程序分享:获取逻辑库中的全部日期数据(2)
在上一篇文章中,我分享了一种快速获取逻辑库中的全部日期数据的做法:SAS 程序分享:获取逻辑库中的全部日期数据 - 哔哩哔哩 (bilibili.com),其中,我利用字典数据集获取全部变量的清单,保留以“DAT”结尾的变量列表,然后遍历这个变量列表,使用 call execute() 子程序动态创建并执行了一段程序,将“DAT”结尾的变量的值不断追加到结果数据集中。然而,我限定日期变量以“DAT”结尾,实际情况却并不总是如此。
可能的实际情况:
日期变量的名称不以“DAT”结尾,甚至是毫无规律的,只是存储着日期值;
日期变量有可能是数值型变量,此时变量带有日期型输出格式;
这对编程提取日期数据增加了一些麻烦,但我们可以分情况讨论。
应对第1种情况,可以使用正则表达式捕获可能的日期值,例如日期 2023-07-14 可以简单地使用 /\d{4}-\d{2}-\d{2}/ 匹配,14JUL2023 则可以使用 /\d{2}\w{3}\d{4}/ 匹配。当同时存在多种日期模式时,就使用竖线将它们隔开。值得指出的是,多写几种可能的日期模式可以增加方法的鲁棒性,但费心写尽所有所有可能的日期模式是没有必要的,这几乎不可能出现在用于商业分析的数据中。
应对第2种情况,则可以在字典数据集中检查它们的 format 是否为常见的日期格式。基于同样的考虑,不需要寻找过多的数值型日期变量的输出格式。
完整程序如下:
上述程序中,仅有输出格式名以“E8601DA”、“YYMMDD”、“DATE” 为前缀的数值型变量,或其值匹配正则表达式“/^\d{4}-\d{2}-\d{2}|\d{2}\w{3}\d{4}$/”的字符型变量会被追加到结果数据集。在结果数据集中,原本的数值型变量按 yymmdd10. 格式存储为字符值,而原本的字符型变量按原始值存储。
基于上一篇文章中的示例数据,上述程序的运行结果为:
