如何使用sas确定特定月份的第三个星期五

  • 本文关键字:星期五 三个 sas 何使用 sas
  • 更新时间 :
  • 英文 :


我有一个时间序列数据。数据如下所示:

date            variable
01-Dec-2012     0.1
02-Dec-2012     0.1
03-Dec-2012     0.1
04-Dec-2012     0.1
05-Dec-2012     0.1
...
20-Dec-2012     0.1
21-Dec-2012     0.1
22-Dec-2012     0.1

我想创建一个虚拟变量,如果日期是在12月,并且在第二个星期四之前或之后,它等于1。如果日期在12月并且在第二个星期四之后,它等于0。如果month(date) ^= 12,则等于缺少。

谁能教我如何识别十二月的第二个星期四并解决这个问题?

NWKDOM

一个月中的第三个星期五,其中的月/年是从SAS日期提取的。

Friday3 = NWKDOM(3, 6, month(sas_date), year( sas_date));

http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm p1kdveu0ry8ltxn1m3um2ntxs7d5.htm

对于没有SAS 9.3+并且不能使用nwkdom的人来说,这里有另一种方法:

Dummy = intck('week.5',intnx('month',date,0)-1,date-1) < 2;

这是如何工作的,从内到外:

  1. intnx用于查找每月的第一天。
  2. 减去1得到前一个月的最后一天。
  3. date减去1得到昨天的日期。
  4. 使用intck,计算这两个日期之间的星期四(week.5)的数目。注意:如果昨天是星期四,则包括昨天,但如果是星期四,则不包括上个月的最后一天。
  5. 如果该数字小于2,则date当前小于或等于该月的第二个星期四。
示例用法:

data _null_;
 do date = '01dec2011'd to '30dec2011'd;
  Dummy = intck('week.5',intnx('month',date,0)-1,date-1) < 2;
  put date weekdate. +1 dummy;
 end;
run;

编辑:现在当一个月的第一天是星期四时可以正常工作。

我想这会解决你的问题。我有一种感觉,有一个更好的解决方案,但它应该工作。

data YourData;
format date date9. ;
do i=1 to 100 ;
date=intnx('day', '17oct03'd,i);
var=rand('uniform');
output;
end;
drop i;
run;
Data Find;
set YourData;
Month=month(date);
day=day(date);
Weekday=WEEKDAY(date);
/* weekday=5 this is thursday */
if weekday=5 and month=12 then flag=1;
/* flag2 retains the value */
flag2+flag;
if month=12 and flag2 < 2 then Dummy=1;
else if month=12 and flag2=2 and flag=1 then Dummy=1;
else if month=12 then Dummy=0;
else Dummy=.;
run;    

最新更新