我希望在SAS中获得一个月的天数。我的日期格式是yyyymm(例如201701),我想记录一个月的天数。数据每月重复(201701,201702 ......等)。我尝试使用Day功能和EOMONTH,但是SAS选择了201701的SAS日期。我是SAS编码的新手,我们将不胜感激。
答案 0 :(得分:1)
SAS日期值是数字类型,其值是自1960年1月1日以来的天数。
您需要先了解代表变量的日期的值类型。 是吗:
如果EOMONTH是字符,则需要将其转换为包含一天的SAS日期值。对于'月'当天的值通常设置为1.例如:
data _null_;
myDateString = '201701';
* note the ||'01' that makes myDate be the first of the month;
myDate = input (trim(myDateString)||'01', yymmdd8.);
format myDate yymmd.;
put myDate=;
put myDate= 12.; * Show in LOG the date as number of days from reference;
run;
----- LOG -----
myDate=2017-01
myDate=20820
有时,您将获得表示数字和编码的数据的日期,以便在查看时显示为YYYYMM。这些值也需要转换为SAS日期值。例如:
data have;
myDateNumber = 201701;
* note the , 1 that makes myDate be the first of the month;
myDate = mdy ( mod(myDateNumber,100), 1, myDateNumber / 100);
format myDate yymmd.;
put myDate=;
put myDate= 12.; * What date value is 'unformatted' is the number of days from reference;
run;
----- LOG -----
myDate=2017-01
myDate=20820
还有其他方法可以将日期的字符或数字表示转换为SAS日期值。请注意,当您在SAS中查看变量时,您需要知道变量类型和查看器应用的格式。
获得SAS日期值后,您可以使用SAS间隔函数INTCK和INTNX计算该日期当月的天数。
days_in_month = intck ('days', /* how many days between next two args */
intnx('month', mydate, 0), /* advance mydate to first of month */
intnx('month', mydate, 1) /* advance mydate to first of next month */
);
此公式无论日期值的月份日期都有效。