2016-10-25 51 views
0

我有一個時間序列數據。數據如下所示:如何識別使用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 

我想創建它等於1,如果日期是在12月和它之前或在第二個星期四虛擬變量。如果日期是在十二月和第二個星期四之後,它等於0。它等於如果月(日期)^ = 12丟失。

任何人都可以教我如何識別12月的第二個星期四,請解決這個問題。

+0

你看ATT可用日期的功能呢?通過使用月份(日期),星期(日期)和日期(日期)等功能,這應該很容易。 – Jonas

+0

如果該月的第一天是星期五,則星期(日期)= 1,但是本星期四不是該月的第一個星期四。我被困在這裏。 – fly36

+0

weekday()應該有所幫助。致力於解決方案。 – Jonas

回答

0

認爲這將解決您的問題。有一種感覺,有一個更好的解決方案,但它應該工作。

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;  
1

這裏的人們另一種方法沒有誰也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; 

編輯:現在正常時每月的第一天是星期四。

+0

這似乎不適用於所有timeperiod。如果do循環在一年前開始,那麼該虛擬標識將標識第三個星期四(2011年12月)。 – Jonas

+0

@Jonas固定,我認爲 – user667489

相關問題