SAS:日期读取问题



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

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

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

谢谢!

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

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

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

由于您的列混合了数字(日期)和字符值 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 
;

最新更新