【问题标题】:SAS date imported wrongSAS日期导入错误
【发布时间】:2020-11-24 01:34:50
【问题描述】:

当我导入我的 Excel 工作表时,某些日期的导入方式与其他日期不同。我试图用下面的代码来解决这个问题以格式化日期。

DATA volume;
SET mice.volume;
format Date MMDDYY10.;
run;

但是,我收到以下错误。

错误 48-59:未找到或无法加载格式 $MMDDYY。

我也试过下面的代码

DATA volume;
SET mice.volume;
If date= 44138 then date= '11/3';
If date= 44141 then date= '11/6';
run;

注意:字符值已在以下位置转换为数值:(行):(列)。

Proc Contents 显示变量= Date type= Char Len=7 format=$7 Informat=$7 Label= Date

我该如何解决这个问题?

【问题讨论】:

标签: sas


【解决方案1】:

日期列是混合了“日期查找”字符串的字符,Excel 日期值数字告诉我 Excel 中的某些日期值实际上是字符串,例如 '11/10='11/10'

原始数字44138 是:

  • SAS 日期值是 04-NOV-2080(显然不是想要的)
  • 一个 Excel 日期值 03-NOV-2020(啊哈!)
  • 03-NOV-2020 因为 SAS 日期值是 22222
    • -21916 与 Excel 的偏移量
  • -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-189930-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 列中的混合值类型强制IMPORTdate 变量视为字符。

  • 带有日期的 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.;

【讨论】:

  • Excel 日期通常基于 1900 年(但可能使用 1904 年),但 SAS 使用 1960 年。要修复添加日期值 '30DEC1899'd ,这是一个负数。
  • 感谢@Tom,清理了很多答案。
  • 您需要使用 30DEC1899,因为 Excel 将 1900 年视为闰年。
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多