无效的数字数据SAS

时间:2017-02-21 19:47:37

标签: sas

请尽量让我忍受,因为我尽可能清楚地解决问题。

我正在尝试合并两个变量,但是我收到一条错误,上面写着“无效的数字数据,DateLastContact = '06 / 30/2005',第1036行第4列。”此消息会重复多次观察。

我正在导入一个包含两个日期列的excel文件。 SAS将其中一列作为数字读取,另一列作为字符(DateLastContact)读取。我试图在SAS和excel中将DateLastContact更改为数字,当我尝试合并时,它仍然会返回无效的数字数据错误。这是我的代码:

PROC IMPORT DATAFILE = "C:\Users\bennetde\Documents\SAS\BCcombined3.xls"     
DBMS = XLS OUT = SASBC REPLACE;
RUN;

proc contents data = SASBC OUT = Check;
RUN;

PROC PRINT DATA = Check;
RUN;

PROC CONTENTS返回:

DateLastContact $ 30 0 $ 30 
DateLastFollowup_ContactOrDeath MMDDYY 10 0   0 

所以我在SAS尝试过:

DATA SASBC;
SET SASBC;
char_DateLastContact = input(DateLastContact, MMDDYY10.);
RUN;

但它没有用。我也尝试过:“char_DateLastContact = input(DateLastContact,12。);

这是我的代码:

PROC IMPORT DATAFILE = "C:\Users\bennetde\Documents\SAS\BCcombined3.xls" 
DBMS = XLS OUT = SASBC REPLACE;
RUN;
DATA SASBC;
SET SASBC;
drop DateLastContact DateLastFollowup_years;
if DateLastContact = . then char_DateLastContact =     
put(DateLastFollowup_years, 20.);
else char_DateLastContact = DateLastContact;
RUN;
proc print data = SASBC;
RUN;

以下是尝试将变量从数字更改为字符后的错误消息示例:

1008  DATA SASBC;
1009  SET SASBC;
1010  char_DateLastContact = input(DateLastContact, MMDDYY10.);
1011  format DateLastContact;
1012  RUN;

NOTE: Invalid argument to function INPUT at line 1010 column 24.
(I can't give you the lines after this unless I change patient info, but 
this error message repeats for several observations.)

这是原始错误:

NOTE: Invalid numeric data, DateLastContact='09/21/2007' , at line 968 
column 4

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

因此,从您的PROC CONTENTS输出中,您有一个长度为$ 30的字符变量DateLastContact,您希望将其转换为日期。

  

DateLastContact $ 30 0 $ 30
  DateLastFollowup_ContactOrDeath MMDDYY 10 0 0

由于Excel没有将DateLastContact视为日期,因此可能存在不会转换的值。此外,由于长度为30美元而不是10美元,所以只需要四位数年份和两个分隔符的日期字符串,您可能在该字段中有一些奇怪的值。

即使你的名字有点倒退,你的第一次尝试看起来也是正确的方法。尝试转换值并要求SAS显示不转换的值。如果要禁止SAS通常生成的错误消息,可以使用?? informat修饰符。您可以尝试使用ANYDTDTE信息,SAS可以调整为多种不同的日期格式。

data want ;
  set SASBC ;
  new_DateLastContact = input(DateLastContact,??ANYDTDTE30.);
  format new_DateLastContact mmddyy10. ;
  if DateLastContact ne ' ' and new_DateLastContact = . then put DateLastContact $char30.;
run;

如果您的值实际上有引号,那么您可以使用DEQUOTE()函数删除引号,然后尝试使用INPUT()函数将结果字符串转换为日期。

  new_DateLastContact = input(dequote(strip(DateLastContact)),??ANYDTDTE30.);

如果值看起来像整数,如

42598 40987 39686 39685 40534 39939 39486 38708 39790

然后似乎SAS已经复制了Excel为日期存储的数字。 SAS和Excel使用不同的开始日期(以及是否从0或1计数以及1900是否为闰年)的差异,因此您可以通过减去正确的数量将这些值转换为SAS日期。

new_DateLastContact = input(DateLastContact,30.) - ('01JAN1960'd - '01JAN1900'd +2);