请尽量让我忍受,因为我尽可能清楚地解决问题。
我正在尝试合并两个变量,但是我收到一条错误,上面写着“无效的数字数据,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
任何帮助都将不胜感激。
答案 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);