SAS Proc比较 - 日期格式不同

问题描述:

我将SAS数据集导出为ex​​cel,然后将其导回到SAS,并且为了验证,执行proc比较以确保所有值都相同。不幸的是,日期在DATETIME20。在原始SAS数据集中,使用MMDDYY10。当我将日期值从excel恢复到SAS时。我可以忍受这一点,但价值比较结果显示没有值匹配,列出04/04/06在基地,04APR2006在比较。SAS Proc比较 - 日期格式不同

有没有办法使proc比较忽略格式,或专门检查是否有变量是MMDDYY10的方法。然后分配该变量DATETIME20。

我没有SAS的经验,但这是我想要做的 - 即。注释掉位:

proc compare b = myBase c = myComp listvar warning; 
* ignore date formats; 
run; 

proc import datafile = myExcelFile 
     out = myBase 
     dbms = xls replace; 
    guessingrows = 32767; 
    getnames = yes; 
      * if anyVariable MMDDYY10. then thatVariable DATETIME20.; 
    sheet = "mySheet"; 
run; 

验证必须SAS做 - 没有Excel中的操作。

SAS存储以秒为单位的DATETIME值和以天为单位的DATE值。 如果您确实只在那些DATETIME变量中存储日期,那么为了比较,您需要将您的DATETIME值转换为DATE值。

data for_compare ; 
    set myComp ; 
    datevar = datepart(datevar); 
    format datevar mmddyy10.; 
run; 

proc compare b = myBase c = for_compare listvar warning; 
run; 

如果你真的是实际存储DATETIME值,那么为什么还要费心去比较,因为他们将不会匹配,因为Excel中已经失去了时间的一部分。

+0

事实上,它可能是Excel没有失去时间的一部分 - 有时你可以将它们作为分数天,在那里'dhms(datevar,0,0,0)'将恢复它们。 – Joe

+0

我不确定我是否觉得这个事实令人感到安慰或可怕。 – Tom

+0

呃,我认为这只是其中一个“从Excel转换而来并不理想”的东西。 :) – Joe

DATETIME20. vs MMDDYY10.不只是格式上的差异 - 这不会是一个问题。

这是基础值的差异,因为日期时间是自1/1/1960 00:00:00以来的秒数,而日期是自1/1/1960以来的天数。非常不同的nubmers(86400倍)。

你需要在导入时控制这个,很可能,或者事后转换。您可以尝试DBSASTYPE告诉Excel将其导入为日期时间:

proc import datafile = myExcelFile 
     out = myBase 
     dbms = excel replace; 
    getnames = yes; 
    sheet = "mySheet"; 
    dbdsopts="dbsastype=(yourdatevar='datetime')"; 
run; 

我认为你必须使用DBMS=EXCEL不XLS使用dbdsopts,但不是100%肯定。您也可以使用选项USEDATE=NO,但我不确定是否会将日期从1/1/1900转换为1/1/1960正确(请参阅"Processing Date and Time Values in Microsoft Excel")。

如果您想在事后进行转换,请使用DATEPART将日期时间转换为日期,或使用newdtvar = DHMS(datevar,0,0,0)将日期转换为日期时间。

+0

不幸的是,我不能使用dbms = excel。这可能是由于excel为32位,而SAS为64位。正如你怀疑的那样,dssastype然后不起作用。不过,我欣赏这些提示,并且现在正在继续。 – DrWhat