日期列是混合了“日期查找”字符串的字符,Excel 日期值数字告诉我 Excel 中的某些日期值实际上是字符串,例如 '11/10 或 ='11/10'。
原始数字44138 是:
- SAS 日期值是
04-NOV-2080(显然不是想要的)
- 一个 Excel 日期值
03-NOV-2020(啊哈!)
-
03-NOV-2020 因为 SAS 日期值是 22222
-
-21916 是 SAS 日期 30-DEC-1899
日期历元
一个纪元是对应于系统日历中基数0 的日期。
SAS 基准年是 1960,Excel 基准年是 1900。
Formatted
Number Actual Date Date Shown System/Format
------ ----------- ----------- ----------
0 31-DEC-1899 1/0/1900 Excel / Short Date (Formatter is weird at Epoch)
0 01-JAN-1960 01-JAN-1960 SAS / DATE11.
21916 01-JAN-1960 1/1/1960 Excel / Short Date
-21916 30-DEC-1899 31-DEC-1899 SAS / DATE11.
注意往返是从31-dec-1899 到30-dec-1899。这是由于由于遗留原因而执行的 Excel 97 错误。请参阅 Microsoft 在 "Excel incorrectly assumes that the year 1900 is a leap year" 中的解释,这将责任进一步推回到 Lotus 1-2-3
系统S1和S2日期数字之间的转换公式是为其他系统纪元日期添加#(@#0)
SAS#(date) = Excel#(date) + SAS#(Excel Epoch Date) - 1 (Excel leap year bug), or
sas_dt = excel_dt + '31-DEC-1899'd - 1; *or;
sas_dt = excel_dt + '30-DEC-1899'd;
发生了什么
Excel date 列中的混合值类型强制IMPORT 将date 变量视为字符。
- 带有日期的 Excel 单元格 m/d 作为字符串引入
- 带有日期的 Excel 单元格(可能自定义格式为 m/d)作为基础 Excel 日期编号引入。
错误
您尝试将日期格式 MMDDYY. 应用于字符变量 Date。
不能为字符列分配数字或日期格式,因此您会得到
ERROR 48-59: The format $MMDDYY was not found or could not be loaded.
SAS 自动假定 MMDDYY. 表示字符格式 $MMDDYY.,因为变量类型是字符。
修复
您可以使用如下代码(未经测试)转换字符date 列中的值:
if index(date,'/') then
date_fixed = input (trim(date)||'/2020', mmddyy10.);
else
date_fixed = input(date,best12.) + '30-DEC-1899'D;
format date_fixed yymmdd10.;
如果您想在 SAS 中继续显示仅 mm/dd,请使用格式NLDATEM5.
format date_fixed NLDATEM5.;