2017-04-07 212 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

相关问题