SAS日期或数字数据?

时间:2012-12-04 04:15:26

标签: sas

%let months_back = %sysget(months_back);

data;
        m = intnx('month', "&sysdate9"d, -&months_back - 2, 'begin');
        m = intnx('day', put(m, date9.), 26, 'same');
        m2back = put(m, yymmddd10.);
        put m2back;
run;
  

注意:字符值已转换为数字值   给出的地方:(线):(列)。         5:19注意:无效的数字数据'01OCT2012',第5行第19行。

我真的不知道为什么会出错。日期字符串是数字数据吗?

2 个答案:

答案 0 :(得分:4)

PUT(m,date9。)是罪魁祸首。 INTNX的第二个参数需要是数字(即日期),PUT函数总是返回一个字符值,在本例中为'01OCT2012'。只需完全取出PUT功能,代码就可以正常工作。

m = intnx('day', m, 26, 'same');

答案 1 :(得分:1)

SAS将日期存储为数字 - 事实上,它们并没有真正独立的类型。 SAS日期是自1960年1月1日以来的天数,因此今天有超过19000天。日期格式与任何日期计算完全无关 - 它仅用于人类可读性。

你说的话:

"&sysdate9"d

实际上将字符串“01JAN2012”转换为数值(18304)。

实际上有一种更快捷的方法来完成你想要做的事情。由于天数与SAS中的整数相对应,要增加一天,您只需在值中添加一个。

例如:

%let months_back=5;
data _null_;
        m = intnx('month', today(), -&months_back - 2, 'begin');
        m2 = intnx('day', m, 26, 'same');
        m3 = intnx('month',"&sysdate9"d, -&months_back - 2)+26;
        m2back = put(m2, yymmdd10.);
        put m= date9. m2= yymmdd10. m3= yymmdd10.;
run;

M3通过使用MONTH间隔,然后添加26,一步完成整个计算.INTNX('day'...)基本上没有意义,除非使用该函数有其他值(使用移位索引例子)。

您还可以在此处看到在PUT(日志)语句中使用格式 - 您不必将其设置为字符值,然后将其放入日志以获取格式化值,只需将其放入(var )(格式。); - 并按照你想要的方式串起来。

此外,“& sysdate9。”d不是获取当前日期的最佳方式。 &安培; SYSDATE。仅在SAS启动时定义,因此如果您的会话运行3天,您将不会在当天(尽管可能需要这样做?)。相反,无论您的SAS会话运行多长时间,TODAY()函数都会获取当前日期。

最后 - 如果您不想要数据集(如果您确实需要,则命名结果数据集),我建议data _null_;data _null_不会创建数据集。数据;只需创建越来越多的数据集(data1,data2,...),这些数据集可以快速填满您的工作区,并且很难说出您正在做什么。