SAS Proc比较 - 日期格式不同
我将SAS数据集导出为excel,然后将其导回到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中已经失去了时间的一部分。
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)
将日期转换为日期时间。
不幸的是,我不能使用dbms = excel。这可能是由于excel为32位,而SAS为64位。正如你怀疑的那样,dssastype然后不起作用。不过,我欣赏这些提示,并且现在正在继续。 – DrWhat
事实上,它可能是Excel没有失去时间的一部分 - 有时你可以将它们作为分数天,在那里'dhms(datevar,0,0,0)'将恢复它们。 – Joe
我不确定我是否觉得这个事实令人感到安慰或可怕。 – Tom
呃,我认为这只是其中一个“从Excel转换而来并不理想”的东西。 :) – Joe