SAS日期导入错误

SAS日期导入错误,sas,Sas,导入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= '1

导入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

我该如何解决这个问题


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

原始编号
44138
为:

  • SAS日期值为2080年11月4日(显然不是想要的)
  • Excel日期值
    2020年11月3日
    (啊哈!)
  • 2020年11月3日
    因为SAS日期值为
    22222
    • Excel的偏移量为
      -21916
  • -21916
    是SAS日期
    1899年12月30日
日期纪元

历元是与系统日历中的基准编号
0
相对应的日期
SAS基准年为
1960
,Excel基准年为
1900

请注意,往返时间是从
1899年12月31日
1899年12月30日
。这是由于Excel 97因遗留原因而出现的错误造成的。请参阅微软的解释,其中将责任推回到Lotus1-2-3

在系统S1和S2日期编号之间转换的公式是为其他系统的纪元日期(@#0)添加#

发生了什么事

Excel
date
列中的混合值类型强制
IMPORT
date
变量视为字符

  • 带有日期字符串m/d的Excel单元格作为字符串引入
  • 带有日期的Excel单元格(可能自定义格式为m/d)作为基础Excel日期编号引入
错误

您试图将日期格式
MMDDYY.
应用于字符变量
date
。 字符列不能指定数字或日期格式,因此您将获得

ERROR 48-59: The format $MMDDYY was not found or could not be loaded.
SAS自动假定
MMDDYY.
表示字符格式
$MMDDYY.
,因为变量类型为字符

修复程序

您可以使用以下代码(未测试)转换字符
日期
列中的值:

如果要继续在SAS中仅显示mm/dd,请使用
NLDATEM5格式。

  format date_fixed NLDATEM5.;

首先修复Excel文件会更容易。确保包含日期的列在每个单元格中仅包含日期,或在每个单元格中仅包含字符串。Excel日期通常基于1900年(但可能使用1904年),但SAS使用1960年。要修复添加日期值'30DEC1899'd,这是一个负数。谢谢@Tom,清理了大量的答案。您需要使用309899,因为Excel将1900视为闰年。
ERROR 48-59: The format $MMDDYY was not found or could not be loaded.
  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.;
  format date_fixed NLDATEM5.;