如何在SAS中使用Format与Informat读取德语格式日期?
在SAS中读取并转换德语格式日期(如12Mai2022)的方法
SAS默认的日期处理工具基于英文格式,针对德语缩写的日期(如12Mai2022、02Okt2020这类日+德语月缩写+年的格式),可以通过以下两种方法处理:
方法一:自定义德语月份Informat
先通过PROC FORMAT定义德语月份缩写与数字的映射,再拆分日期字符串生成SAS日期值。
/* 定义德语月份缩写到数字的映射,注意处理带变音的三月"Mär" */ PROC FORMAT; INVALUE de_month 'Jan' = 1 'Feb' = 2 'Mär' = 3 'Apr' = 4 'Mai' = 5 'Jun' = 6 'Jul' = 7 'Aug' = 8 'Sep' = 9 'Okt' = 10 'Nov' = 11 'Dez' = 12 ; RUN; /* 读取并转换日期 */ DATA test_de_date; input raw_date $10.; /* 拆分原始日期的日、月、年部分 */ day = INPUT(SUBSTR(raw_date, 1, 2), 2.); month = INPUT(SUBSTR(raw_date, 3, 3), de_month.); year = INPUT(SUBSTR(raw_date, 6, 4), 4.); /* 生成SAS日期值(SAS日期是从1960年1月1日开始的天数) */ sas_date = MDY(month, day, year); /* 用DATE9.格式显示日期,也可换成其他格式如DDMMYY10. */ format sas_date DATE9.; DATALINES; 12Mai2022 02Okt2020 06Dez2022 ; RUN; /* 查看结果 */ PROC PRINT data=test_de_date; RUN;
方法二:替换德语月份为英文后用默认Informat读取
把德语月份缩写替换成SAS默认识别的英文缩写,直接用INPUT函数配合标准日期informat读取。
DATA test_de_date2; input raw_date $10.; /* 批量替换德语月份为英文缩写 */ eng_date = TRANSLATE(raw_date, 'MayOctDec', 'MaiOktDez'); /* 若需处理所有月份,可使用完整替换规则 */ eng_date = TRANSLATE(eng_date, 'JanFebMarAprMayJunJulAugSepOctNovDec', 'JanFebMärAprMaiJunJulAugSepOktNovDez'); /* 用DATE9. informat读取转换后的英文格式日期 */ sas_date = INPUT(eng_date, DATE9.); format sas_date DATE9.; DATALINES; 12Mai2022 02Okt2020 06Dez2022 ; RUN; PROC PRINT data=test_de_date2; RUN;
关键注意事项
- 编码问题:如果日期中包含德语变音字符(如
Mär),需确保SAS的编码设置与数据集编码一致(如UTF-8),避免出现乱码或匹配失败。如果数据中是不带变音的Mar,直接替换即可。 - 日期长度适配:若原始日期字符串长度不一致(如单日日期是1位而非2位),需调整
SUBSTR的参数,或改用SCAN函数按位置拆分。
内容的提问来源于stack exchange,提问作者Tejashree Thorat
相关产品推荐
相关产品推荐

