SAS:插入空行

时间:2013-07-19 15:35:45

标签: sas time-series

我正在计算金融时间序列数据的一些区间统计(例如,一分钟间隔的标准偏差)。我的代码设法获得包含数据的所有间隔的结果,但是对于时间序列中不包含任何观察的间隔,我想插入一个空行只是为了保持时间戳的一致性。

例如,如果有10:00到10:01,10:02到10:03之间的数据,而不是10:01到10:02,我的输出将是:

10:01 stat1 stat2 stat3
10:03 stat1 stat2 stat3

如果结果可能是理想的(我希望某些值为0,有些值丢失'。'):

10:01 stat1 stat2 stat3
10:02 0     0     .
10:03 stat1 stat2 stat3

我做了什么:

 data v_temp/view = v_temp;
    set &taq_ds;
    where TIME_M between &start_time and &end_time;
    INTV = hms(00, ceil(TIME_M/'00:01:00't),00); *create one minute interval;
    format INTV tod.; *format hh:mm:ss;
 run; 

 proc means data = sorted noprint;
    by SYM_ROOT DATE INTV;
    var PRICE;
    weight SIZE;
    output 
    out=oneMinStats(drop=_TYPE_ _FREQ_) 
    n=NTRADES  mean=VWAP sumwgt=SUMSHS max=HI min=LO std=SIGMAPRC
    idgroup(max(TIME_M) last out(price size ex time_m)=LASTTRD LASTSIZE LASTEX LASTTIME);
 run;

对于一些非活跃的股票,存在很多这样的差距。什么是生成这些填充行的有效方法?

1 个答案:

答案 0 :(得分:2)

如果您获得SAS:ETS许可,PROC EXPAND是在时间序列中添加空行的不错选择。这是一个非常简短的例子:

data mydata;
input timevar stat1 stat2 stat3;
format timevar TIME5.;
informat timevar HHMMSS5.;
datalines;
10:01 1 3 5
10:03 2 4 6
;;;;
run;

proc expand data=mydata out=mydata_exp from=minute to=minute observed=beginning method=none;
id timevar;
run;

如果您想执行内部/外推或类似的事情,documentation会有更多详细信息。重要的选项来自= minute,observed = beginning,method = none(无外推或插值)和id(标识时间变量)。

如果您没有ETS,那么数据步骤就足够了。您可以合并到已知数据集,也可以添加自己的行;数据集的大小在某种程度上决定哪个更容易。这是合并变化。在datastep变体中添加自己的行与我创建额外行的方式类似。

*Select the maximum time available.;
proc sql noprint;
select max(timevar) into :endtime from mydata;
quit;

*Create the empty dataset with just times;
data mydata_tomerge;
set mydata_tomerge(obs=1);
do timevar = timevar to &endtime by 60; *by 60 = minutes!;
output;
end;
keep timevar;
run;
*Now merge the one with all the times to the one with all the data!;
data mydata_fin;
merge mydata_tomerge(in=a) mydata;
by timevar;
if a;
run;