SAS-观测1减去观测2

SAS-观测1减去观测2,sas,Sas,我想计算时间t的价格减去时间t+1的价格,对于第k天的证券I。特别地,t+1被定义为在时间t的价格之后至少5分钟的价格。因此,我添加了一个变量来调节时间间隔,并使用以下代码在时间t+1创建一行价格。 这是输入数据的示例 data test4; length _ric$ 25 type$ 5 interval$ 15 time_l_$ 25 ; input _ric$ date_l_ time_l_ type$ price interval$;

我想计算时间t的价格减去时间t+1的价格,对于第k天的证券I。特别地,t+1被定义为在时间t的价格之后至少5分钟的价格。因此,我添加了一个变量来调节时间间隔,并使用以下代码在时间t+1创建一行价格。 这是输入数据的示例

    data test4;
       length _ric$ 25 type$ 5 interval$ 15 time_l_$ 25 ;
       input _ric$ date_l_ time_l_  type$ price interval$;
       datalines;
      AXPA031407800.U   20131212    9:52:56.537 Trade   5.85    09:50:00
    AXPA031407800.U 20131212    9:52:56.537 Trade   5.85    09:50:00
    AXPA031407800.U 20131212    9:53:13.586 Trade   5.8 09:50:00
    AXPA031407800.U 20131212    9:53:13.586 Trade   5.8 09:50:00
    AXPA031407800.U 20131212    9:53:13.607 Trade   5.8 09:50:00
    AXPA031407800.U 20131212    9:53:13.607 Trade   5.8 09:50:00
    AXPA031407800.U 20131212    9:53:34.990 Trade   5.8 09:50:00
    AXPA031407800.U 20131212    9:55:12.990 Trade   5.7 09:55:00
    AXPA031407800.U 20131212    9:55:12.990 Trade   5.7 09:55:00
    AXPA031407800.U 20131212    9:55:13.002 Trade   5.7 09:55:00
    AXPA031407800.U 20131212    9:55:13.002 Trade   5.7 09:55:00
    AXPA031407800.U 20131212    9:55:13.002 Trade   5.7 09:55:00
    AXPA031407800.U 20131212    9:55:13.011 Trade   5.7 09:55:00
    AXPA031407900.U 20131205    9:37:58.420 Trade   6.25    09:35:00
    AXPA031407900.U 20131205    9:39:04.996 Trade   6.25    09:35:00
    AXPA031407900.U 20131205    9:39:04.996 Trade   6.25    09:35:00
    AXPA031407900.U 20131205    9:39:04.996 Trade   6.25    09:35:00
    AXPA031407900.U 20131205    9:39:04.996 Trade   6.25    09:35:00
    AXPA031407900.U 20131205    9:39:04.996 Trade   6.25    09:35:00
;

data test1;
  set test nobs=nobs;
  do _i = _n_ to nobs until (new_date ne date_l_ or new_time > interval);
    set test (rename=(date_l_=new_date price=new_price interval=new_time)) point=_i;
  end;
  if (date_l_ ne new_date) or (_i > nobs) then call missing(new_price);  
  run;
输出数据如下所示。但是,RIC(安全名称)、日期和时间会发生更改。例如,如输出数据所示,AXPA031407800.U在输入数据中有13个观察值,但在输出数据中有7个观察值

_ric    type    interval    time_l_ date_l_ price   new_date    new_time    new_price
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.85    20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.85    20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.8 20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.8 20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.8 20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.8 20131212    09:55:00    5.7
AXPA031407800.U Trade   09:50:00    9:55:12.990 20131212    5.8 20131212    09:55:00    5.7
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:55:00    9:37:58.420 20131212    5.7 20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
AXPA031407900.U Trade   09:35:00    9:39:04.996 20131205    6.25    20131205    09:35:00    
这是我的目标结果,它创建了一个新变量Price\u next\u interval。新变量表示同一天下一个区间的价格

_RIC            Date_l_     time_l_         type    Price   interval    Price_next_interval
AXPA031407800.U 20131212    9:52:56.537 Trade   5.85    09:50:00    5.7
AXPA031407800.U 20131212    9:52:56.537 Trade   5.85    09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.586 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.586 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.607 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.607 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:34.990 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:55:12.990 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:12.990 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.011 Trade   5.7     09:55:00    .
AXPA031407900.U 20131205    9:37:58.420 Trade   6.25    09:35:00    6.28
AXPA031407900.U 20131205    9:45:04.996 Trade   6.28    09:45:00    6.29
AXPA031407900.U 20131205    9:45:04.996 Trade   6.28    09:45:00    6.29
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .

我认为,通过分组处理和
保留
更容易做到这一点:

    data test4;
       length _ric$ 25 type$ 5;
       input _ric $ date_l_ :yymmdd8. time_l_ :time.  type$ price interval :time. price_next_interval_goal;
       format date_l_ yymmddn8. time_l_ interval time.;
       datalines;
AXPA031407800.U 20131212    9:52:56.537 Trade   5.85    09:50:00    5.7
AXPA031407800.U 20131212    9:52:56.537 Trade   5.85    09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.586 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.586 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.607 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:13.607 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:53:34.990 Trade   5.8     09:50:00    5.7
AXPA031407800.U 20131212    9:55:12.990 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:12.990 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.002 Trade   5.7     09:55:00    .
AXPA031407800.U 20131212    9:55:13.011 Trade   5.7     09:55:00    .
AXPA031407900.U 20131205    9:37:58.420 Trade   6.25    09:35:00    6.28
AXPA031407900.U 20131205    9:45:04.996 Trade   6.28    09:45:00    6.29
AXPA031407900.U 20131205    9:45:04.996 Trade   6.28    09:45:00    6.29
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .
AXPA031407900.U 20131205    9:55:04.996 Trade   6.29    09:55:00    .
;

/* Sort into reverse order */
proc sort data = v_want out = want;
    by descending date_l_ interval;
run;

/* Carry the price forward via retain if we've got to the last row for this interval  */
/* N.B. do not populate retained figure until after the row has been output*/
/* Clear the carried-forward figure at the start of each date*/
data want2;
set test4;
by descending date_l_ descending interval;
if first.date_l_ then call missing(price_next_interval);
output;
retain price_next_interval;
if last.interval then price_next_interval = price;
run;

/*Sort back into original order*/
proc sort data = want2;
by descending date_l_ interval;
run;

请提供一些纯文本格式的输入和输出数据示例。否则,您实际上是在要求他人为您转录数据。我添加了一个输入和输出数据示例,谢谢。这很好-请您也添加一个您所需输出的示例。谢谢您的建议。我提供了一个所需的输出,该输出创建了一个新变量来表示同一天下一个区间的价格。如果下一个区间有多个价格,您希望使用哪一个?