我有一个时间序列数据。数据如下所示:
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;
这是如何工作的,从内到外:
-
intnx
用于查找每月的第一天。 - 减去1得到前一个月的最后一天。
- 从
date
减去1得到昨天的日期。 - 使用
intck
,计算这两个日期之间的星期四(week.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;