【问题标题】:SAS Proc Compare - dates in different formatsSAS Proc 比较 - 不同格式的日期
【发布时间】:2016-09-23 14:53:09
【问题描述】:

我将 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。

【问题讨论】:

    标签: sas compare


    【解决方案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 已经丢失了时间部分,所以它们将不匹配。

    【讨论】:

    • 实际上可能 Excel 并没有丢失时间部分 - 您有时可以将它们作为小数天数,dhms(datevar,0,0,0) 将恢复它们。
    • 我不确定我是否觉得这个事实令人欣慰或害怕。
    • 嗯,我认为这只是“从 Excel 转换不理想”的事情之一。 :)
    • 原始日期时间值的时间为 00:00:00,所以我真的只需要比较日期值,正如您所关注的那样。
    【解决方案2】:

    DATETIME20.MMDDYY10. 不仅仅是格式上的差异 - 这不是问题。

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

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

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

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

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

    【讨论】:

    • 很遗憾,我不能使用 dbms = excel。这可能是由于 excel 是 32 位的,而 SAS 是 64 位的。正如您所怀疑的那样, dssastype 然后不起作用。不过,我很欣赏这些提示,并且现在正在跟进。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多