SAS:日期阅读问题

时间:2018-01-27 15:00:00

标签: excel sas

我已导入excel表格,其中date1为4/1/16 date2为5/29/14,而date3为5/2/14。但是,当我将工作表导入SAS并执行PROC PRINT时,前两个变量列为" 42461"和" 41788"而date3是05/02/2014。

我需要这些日期格式一致b / c我正在使用PROC PHREG进行Cox回归。

关于如何使这些日期保持一致的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

评论太长了。

这可能取决于数据在Excel中的表示方式以及如何将数据导入SAS。首先,Excel中的格式是否相同?前两个是作为数字导入的。第二个是字符串。

在Excel中,您可以使用日期格式格式化列。也许你的导入方法会认识到这一点。您还可以将另一列定义为字符串,使用text(<whatever>, "YYYY-MM-DD")转换为该格式的字符串。

或者,您可以将全部导入为数字,然后将值添加到1899-12-31。这是Excel的基准日期。如果您将“1”视为1900-01-01,则更有意义。

答案 1 :(得分:1)

由于您的列具有混合数字(日期)和字符值,因此SAS将字段导入为字符。因此,实际日期作为Excel为日期存储的实际数字的文本版本导入。在SAS中看起来像日期字符串的那些字段也是Excel中的字符串。

或者,如果在您的情况下,三列中的一列都是有效日期,那么SAS会将​​其作为数字导入并为其指定日期格式,因此无需修复该列。

解决此问题的最佳方法是确保日期列中的所有值都是实际日期或空单元格。然后PROC IMPORT将能够正确猜出如何导入它。

一旦你在SAS中使用了字符串并且想要尝试修复它们,那么你需要确定哪些字符串看起来像整数,哪些字符串应该被视为日期字符串。

所以你可能只是检查它们是否有任何非数字字符,并假设它们是日期字符串而不是数字。对于那些看起来像整数的数字,只需调整数字就可以说明Excel数字的历史可以追溯到1900年,而SAS则从1960年开始编号。

data want ;
  set have ;
  if missing(exel_string) then date=.;
  else if notdigit(trim(excel_string)) then date=input(excel_string,anydtdte32.);
  else date=input(excel_string,32.) + '01JAN1900'd -2 ;
  format date yymmdd10. ;
run;

你可能想知道为什么减2?这是因为Excel从1而不是0开始,也因为Excel认为1900是闰年。以下是一些关键日期的Excel日期编号和一些转换它们的SAS程序。试试吧。

data excel_dates;
  input datestr :$10. excel_num :comma32. @1 sas_num :yymmdd10. ;
  diff = sas_num - excel_num ;
  format _numeric_ comma14. ;
  sasdate1 = excel_num - 21916; 
  sasdate2 = excel_num + '01JAN1900'd -2 ;
  format sasdate: yymmdd10.;
cards;
1900-01-01  1 
1900-02-28  59 
1900-03-01  61 
1960-01-01  21,916 
2018-01-01  43,101 
;