我正在将SAS数据集导出到Excel,然后将其导回SAS,并且为了验证,执行proc比较以确保所有值都相同。不幸的是,日期,在DATETIME20。在原始SAS数据集中,在MMDDYY10中。当我将日期值从excel带回SAS时。我可以忍受,但价值比较结果显示没有值匹配,在基数列出04/04/06,在比较中列出04APR2006。
有没有办法让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。
答案 0 :(得分:1)
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已经丢失了时间部分。
答案 1 :(得分:1)
DATETIME20.
vs MMDDYY10.
不仅仅是格式上的差异 - 这也不是问题。
这是基础价值的差异,因为日期时间是自1/1/1960 00:00:00以来的秒数,而日期是自1960年1月1日以来的天数。非常不同的nubmers(因子为86400)。
你可能需要在导入时控制它,或者在事后转换。您可以尝试DBSASTYPE
告诉Excel将其导入为datetime:
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")。< / p>
如果您想在事后转换,请使用DATEPART
将日期时间转换为日期,或使用newdtvar = DHMS(datevar,0,0,0)
将日期转换为日期时间。