2017-04-07 207 views
1

我有兩個日期,開始日期和結束日期。SAS給定一個開始日期和結束日期我需要知道在開始日期和結束日期之後的每個30天的日期

我想知道第35天的日期,然後是以後的30天。

我有;

start  end 
22-Jun-15 22-Oct-15 
9-Jan-15 15-May-15 

我想要;

start  end   tik1  tik2  tik3  tik4 
22-Jun-15 22-Oct-15 27-Jul-15 26-Aug-15 25-Sep-15 
9-Jan-15 15-May-15 13-Feb-15 15-Mar-15 14-Apr-15 14-May-15 

我很好的日期計算,但我真正的問題是創建一個變量並增加其名稱。我決定把我的整個問題都包括在內,因爲我認爲在它的上下文中解釋可能更容易。

+0

你目前對這個問題的解決方法是什麼? –

+0

你可以有一個宏來獲取列的值,並在循環中增加變量名....用你得到的變量創建一個臨時表......並且與之前的tabel合併 –

+0

你真的想要寬輸出格式?或者一個長而窄的格式也可以工作,即爲每個時期生成一個記錄, – Quentin

回答

2

您可以通過以下邏輯解決的問題:要添加

1)列的確定數量。

2)計算值列基礎的要求

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 
proc sql; 
select max(no_of_col) into: number_of_columns from noc_cal; 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

替代方法(櫃面你不想使用PROC SQL)

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 

proc sort data=noc_cal; 
by no_of_col; 
run; 

data _null_; 
set noc_cal; 
by no_of_col; 
if last.no_of_col; 
call symputx('number_of_columns',no_of_col); 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

我的輸出:

> **start |end  |tik1  | tik2  |tik3  |tik4** 
> 22Jun2015 |22Oct2015 |27Jul2015| 26Aug2015|25Sep2015|  
> 09Jan2015 |15May2015 |13Feb2015| 15Mar2015|14Apr2015|14May2015 
+0

我需要更多時間來消化這個!輸出是根據需要的,我不想使用proc sql,但是在這種情況下我可以再次欣賞簡潔性。我肯定會擴大我的想法。謝謝! – heroz

+0

@heroz如果你不想使用proc sql,我已經添加了一個替代解決方案。如果您需要詳細說明代碼,請告訴我。此外,如果我的答案幫助您解決了查詢,請訪問以下鏈接:http://stackoverflow.com/help/someone-answers –

+0

看起來不錯,詳細的說明會非常有幫助。我最感興趣的代碼是使用%sysfunc增加變量名稱的最後一部分,它將進入我的代碼中以完成它。 – heroz

0

我傾向於喜歡長垂直結構。我會接近它:

data want; 
    set have; 
    tik=start+35; 
    do while(tik<=end); 
    output; 
    tik=tik+30; 
    end; 
    format tik mmddyy10.; 
run; 

如果您確實需要它,可以在第二步中轉置該數據集。

+0

我不會想到這樣,但它肯定值得進一步探索,因爲這看起來很簡單。由於使用這些信息的方式,廣泛的偏好,我會研究轉置 - 我一直在學習。感謝您提供這個! – heroz

+0

我想將此標記爲有用,但我無法做到這一點,因爲我的代表質量很低,對此感到抱歉。 – heroz

相關問題