代码之家  ›  专栏  ›  技术社区  ›  Michiel Borkent

SAS中带毫秒的日期时间:无处可寻的最高精度数字

  •  2
  • Michiel Borkent  · 技术社区  · 16 年前

    有人能解释变量d4到d7中的最高精度数字来自哪里吗?

    data foo;         
        format d1-d7 datetime30.6; 
        timestring = "23:59:59.997000000"; 
        time = input(timestring,time18.); 
        d1 = dhms(0,0,0,time); 
        d2 = dhms('08DEC1981'd,0,0,time); 
        d3 = dhms('31DEC2503'd,0,0,time); 
        d4 = dhms('31DEC2504'd,0,0,time); 
        d5 = dhms('08DEC2981'd,0,0,time); 
        d6 = dhms('08DEC4981'd,0,0,time); 
        d7 = dhms('08DEC9999'd,0,0,time); 
    run; 
    proc print;run; 
    

    输出:

    Obs                             d1                             d2                             d3 
    
      1       01JAN1960:23:59:59.997000      08DEC1981:23:59:59.997000      31DEC2503:23:59:59.997000 
    
     Obs                             d4                             d5                             d6 
    
      1       31DEC2504:23:59:59.997002      08DEC2981:23:59:59.997002      08DEC4981:23:59:59.996994 
    
     Obs                             d7        timestring          time 
    
      1       08DEC9999:23:59:59.997009    23:59:59.997000000    86400.00 
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Ville Koskinen    16 年前

    自1960年1月1日起,SAS datetime值存储为秒数,因此我很确定这是由二进制浮点数表示基数10的问题造成的。例如,见 this article .

    我现在无法访问SAS,因此无法进行检查,但例如,我将12月31日、2504年、23:59:59:997存储为17198611199.997。这里没有精度损失,因此当SAS将数字格式化回datetime表示形式时会导致错误。

    >>> from datetime import timedelta
    >>> timedelta(seconds=17198611199.997)
    datetime.timedelta(199057, 86399, 997002)
    

    这是给定的秒数,转换为199057天、86399秒和99702微秒。