Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 带if语句的sasdo循环_Loops_If Statement_Sas_Sas Macro_Do Loops - Fatal编程技术网

Loops 带if语句的sasdo循环

Loops 带if语句的sasdo循环,loops,if-statement,sas,sas-macro,do-loops,Loops,If Statement,Sas,Sas Macro,Do Loops,我试图将数据集分组为三个月组或季度,但由于我是从任意日期开始的,因此无法在sas中使用quarter函数 开始日期始终相同,因此我的第一个季度将是2018年9月3日至2018年12月3日,该季度的任何活动日期都将是1,然后第二季度将是2018年12月3日至2019年3月3日,依此类推。这不能手动编码,因为开始日期将根据数据而变化,季度数可能最多为20+ 下面是我迄今为止尝试的代码 data test_Data_op; set test_data end=eof; %let j = 0; %le

我试图将数据集分组为三个月组或季度,但由于我是从任意日期开始的,因此无法在sas中使用quarter函数

开始日期始终相同,因此我的第一个季度将是2018年9月3日至2018年12月3日,该季度的任何活动日期都将是1,然后第二季度将是2018年12月3日至2019年3月3日,依此类推。这不能手动编码,因为开始日期将根据数据而变化,季度数可能最多为20+

下面是我迄今为止尝试的代码

data test_Data_op;
set test_data end=eof;
%let j = 0;
%let start_date = start_Date;
if &start_Date. <= effective_dt < (&start_date. + 90) then quarter = &j.+1;
run;
data test\u data\u op;
设置测试数据端=eof;
%设j=0;
%让开始日期=开始日期;

开始日期(&U) 根据@Lee的评论。编辑以匹配屏幕截图中的数据

示例显示,5月11日将是第三季度,因为种子日期是9月3日

data have;
input mydate :yymmdd10.;
format mydate yymmddd10.;
datalines;
2018-09-13
2018-12-12
2019-05-11
;
run;

%let start_date='03sep2018'd;

data want;
set have;
quarter=floor(mod((yrdif(&start_date,mydate)*4),4))+1;
run;
如果您希望季度数超过4个季度(例如2019年9月4日将在第5季度,而不是循环回1个季度),则从功能中删除“mod”:

quarter=floor(yrdif(&start_date,mydate)*4)+1;

根据@Lee的评论。编辑以匹配屏幕截图中的数据

示例显示,5月11日将是第三季度,因为种子日期是9月3日

data have;
input mydate :yymmdd10.;
format mydate yymmddd10.;
datalines;
2018-09-13
2018-12-12
2019-05-11
;
run;

%let start_date='03sep2018'd;

data want;
set have;
quarter=floor(mod((yrdif(&start_date,mydate)*4),4))+1;
run;
如果您希望季度数超过4个季度(例如2019年9月4日将在第5季度,而不是循环回1个季度),则从功能中删除“mod”:

quarter=floor(yrdif(&start_date,mydate)*4)+1;

如果已经有开始日期和实际事件日期,则不需要执行循环。只需计算月数,然后除以三。使用INTCK()函数的continuous方法处理不是一个月的第一天的开始日期

month_number=intck('month',&start_date,mydate,'cont')+1;
qtr_number=floor((month_number-1)/3)+1;

如果已经有开始日期和实际事件日期,则不需要执行循环。只需计算月数,然后除以三。使用INTCK()函数的continuous方法处理不是一个月的第一天的开始日期

month_number=intck('month',&start_date,mydate,'cont')+1;
qtr_number=floor((month_number-1)/3)+1;
季度的传统用法是指相对于1月1日的3个月时间段。确保您的受众理解您的数据演示中的短语“季度”实际上意味着相对于任意起点的3个月

funky quarter可以从一个月的间隔功能上进行计算,使用
INTCK
的组合进行基准月计算,并使用逻辑表达式进行调整,以与开始日期当月的日期相关。不需要循环

例如:

data have;
  do startDate = '11feb2019'd ;
    do effectiveDate = startDate to startDate + 21*90;
      output;
    end;
  end;
  format startDate effectiveDate yymmdd10.;
run;

data want;
  set have;

  qtr = 1 
      + floor(
          ( intck ('month', startDate, effectiveDate) 
            -
            (day(effectiveDate) < day(startDate))
          ) 
          / 3
        );

  format qtr 4.;
run;
--------输出---------

季度的传统用法是指相对于1月1日的3个月时间段。确保您的受众理解您的数据演示中的短语“季度”实际上意味着相对于任意起点的3个月

funky quarter可以从一个月的间隔功能上进行计算,使用
INTCK
的组合进行基准月计算,并使用逻辑表达式进行调整,以与开始日期当月的日期相关。不需要循环

例如:

data have;
  do startDate = '11feb2019'd ;
    do effectiveDate = startDate to startDate + 21*90;
      output;
    end;
  end;
  format startDate effectiveDate yymmdd10.;
run;

data want;
  set have;

  qtr = 1 
      + floor(
          ( intck ('month', startDate, effectiveDate) 
            -
            (day(effectiveDate) < day(startDate))
          ) 
          / 3
        );

  format qtr 4.;
run;
--------输出---------


使用YRDIF,然后乘以4,加上1,将数据粘贴到你的问题中,而不是链接到问题的图片,这不是更好吗。
do
循环在哪里?为什么开始日期是一种格式(
mmddyy10.
),活动日期是另一种格式(
mmddyy10.
)?如果是mmddyy10,是否还有任何特殊原因需要使用宏变量(即
start_date
)?@Richard。为什么会有第十三个月?啊。这应该是相反的。活动日期的格式似乎是
ddmmyy10.
(不是mmddyy10,正如我在第一条评论中所说的)。因此,我猜四分之一的数字都是
ddmmyy
,这不是我在美国经常看到的格式。使用YRDIF,然后乘以4,将其加上1,将数据粘贴到你的问题中,而不是链接到问题的图片上,不是更好吗。
do
循环在哪里?为什么开始日期是一种格式(
mmddyy10.
),活动日期是另一种格式(
mmddyy10.
)?如果是mmddyy10,是否还有任何特殊原因需要使用宏变量(即
start_date
)?@Richard。为什么会有第十三个月?啊。这应该是相反的。活动日期的格式似乎是
ddmmyy10.
(不是mmddyy10,正如我在第一条评论中所说的)。因此,我猜对于四分之一数字,它们都是
ddmmyy
,不是我们经常看到的格式
continuous
方法非常简单。然而,在某些情况下,您的qtr_编号与我的不同。当
startDate
是一个月的最后一天或两天,而
effectiveDate
是未来一个月的最后一天或两天时,可能会发生这种情况,但并非总是如此。请参阅我将在答案中添加的额外部分。可以使用“qtr”而不是“month”
continuous
方法非常简单。然而,在某些情况下,您的qtr_编号与我的不同。当
startDate
是一个月的最后一天或两天,而
effectiveDate
是未来一个月的最后一天或两天时,可能会发生这种情况,但并非总是如此。请参阅我将在回答中添加的额外部分。是否可以使用“qtr”而不是“月”,因此,如果开始日期是1月的最后一天,那么4月的最后一天将被视为第一季度的一部分,而不是下一季度的开始?这可能是用户需要决定其工作方式的问题。因此,如果开始日期是1月的最后一天,那么4月的最后一天将被视为第一季度的一部分,而不是下一季度的开始?这可能是用户需要决定其工作方式的原因。