【问题标题】:Invalid numeric data SAS无效的数值数据 SAS
【发布时间】:2017-02-21 19:47:36
【问题描述】:

请多多包涵,我会尽可能清楚地解决我的问题。

我正在尝试合并两个变量,但我收到一条错误消息,提示“无效的数字数据,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

任何帮助将不胜感激。

【问题讨论】:

    标签: sas


    【解决方案1】:

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

    DateLastContact $ 30 0 $ 30
    DateLastFollowup_ContactOrDeath MMDDYY 10 0 0

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

    你的第一次尝试看起来是正确的方法,即使你的名字有点倒退。尝试转换值并要求 SAS 显示未转换的值。如果要抑制 SAS 通常会生成的错误消息,可以使用 ?? 信息修饰符。您可以尝试使用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);
    

    【讨论】:

    • 这有点帮助,但我仍然有错误。它似乎没有将数据转换为数字或日期格式,但它列出了那些遇到问题的值。即使我将这些值转换为 Excel 中的日期,它仍然会将它们读取为 SAS 3 DATA SASBC2 中的字符; 4套国资委; 5 new_DateLastContact = input(DateLastContact, ??ANYDTDTE30.); 6 格式 new_DateLastContact mmddyy10.; 7 如果 DateLastContact ne ' ' 和 new_DateLastContact = 。然后把 DateLastContact $char30.; 8运行; 42598 40987 39686 39685 40534 39939 39486 38708 39790
    • 看起来有些日期是 Excel 为日期存储的整数。要将它们转换为 SAS 为日期存储的整数,您需要减去它们使用的偏移日期的差异。尝试将这些整数转换为数字,然后减去 ('01JAN1960'd - '01JAN1900'd + 2) 并将日期格式应用于结果数字。
    • 我想我现在要放弃了,哈!我在 DateLastContact 中有超过 1,000 个观察值,并且我尝试的所有操作都不会将此列转换为数字,因为我需要它来进行合并,并且我在 excel 和 SAS 中尝试了多种方法。我什至不能创建一个新列并将真实日期(不是序列号)转移到新列并确保新列具有数字格式,因为新列在 SAS 中也被读取为字符! =(
    • P.S.感谢您提供帮助。
    • 检查 Excel 中的空单元格。这可能是让导入工具认为整列应该是文本的原因。或者只是将文件 Excel 工作表导出为 CSV 文件,然后使用数据步骤读取它,您可以完全控制如何读取 CSV 文件中的文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多