从SAS中的时间戳计算间隔

时间:2016-07-12 11:40:15

标签: time sas

我有一些数据:

data beforehave;
   input ID TIME_EVENT $ Activity $;
   datalines;
12345 07:03:875 Activity1
12345 07:04:004 Activity1
12345 07:05:062 Activity1 
12345 07:07:357 Activity2 
12345 07:10:743 Activity2 
23145 07:12:737 Activity1 
23145 07:14:065 Activity2 
23145 07:15:037 Activity2 
;
RUN;

我想得到一些看起来像这样的数据,我计算步骤之间的时间,然后每次第一个活动1出现时将计数器重置为0;

data beforehave;
   input ID TIME_EVENT $ Activity $ TIME_TAKEN;
   datalines;
12345 07:03:875 Activity1 00:00:000
12345 07:04:004 Activity1 00:00:029
12345 07:05:062 Activity1 00:01:058
12345 07:07:357 Activity2 00:01:295
12345 07:10:743 Activity2 00:03:386
23145 07:12:737 Activity1 00:00:000
23145 07:14:065 Activity2 00:01:672
23145 07:15:037 Activity2 00:00:972
;
RUN;

我认为我需要花费特定活动从Activity1的第一个ID发生时开始的时间。我已经考虑过这样做的中间步骤,我创建一个更新的字段来拉过TIME_EVENT的{​​{1}} Activity1。这个中间步骤看起来像这样;

data beforehave;
   input ID TIME_EVENT $ Activity $ TIME_INTER;
   datalines;
12345 07:03:875 Activity1 07:03:875
12345 07:04:004 Activity1 07:03:875
12345 07:05:062 Activity1 07:03:875
12345 07:07:357 Activity2 07:03:875
12345 07:10:743 Activity2 07:03:875
23145 07:12:737 Activity1 07:12:737
23145 07:14:065 Activity2 07:12:737
23145 07:15:037 Activity2 07:12:737
;
RUN;

要创建这个,我可以先使用SAS。功能并写了这个;

data OUT.DATA;    
   set IN.DATA;
   if first.Activity = 'Activity1' then TIME_INTER = TIME_EVENT;
run;

从这里我得到一个空白的领域。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

data OUT.DATA(drop=TIME_EVENT_prev);
   set beforehave;
   by ID;
   retain TIME_EVENT_prev;
   if first.ID then TIME_INTER = 0;
   else TIME_INTER = TIME_EVENT +(-TIME_EVENT_prev);
   TIME_EVENT_prev = TIME_EVENT;
run;

保留变量TIME_EVENT_prev在每一行都是固定的,在修复当前行之前,它具有前一行的值。

答案 1 :(得分:1)

事实证明,我的TIME_EVENT字段实际上是一种字符格式,因此必须重新制作为时间数据类型。此外,我只有最后一种Activity类型开头的时间戳,所以TIME_INTERVAL成为下一个Activity1之前的时间,这实际上毫无意义。因此,我必须将其设置为0.此代码基本上与上面由andrey_sz发布的代码相同,只是为上面提到的那些事情做了几个推文;

data OUT.DATA(drop=TIME_EVENT_prev);
    set beforehave;
    by ID;
    TIME_EVENT=input(TIME_EVENT,TIME8.);
    retain TIME_EVENT_prev;
    if first.ID then TIME_INTER = 0;
    else TIME_INTER = TIME_EVENT +(-TIME_EVENT_prev);
    TIME_EVENT_prev = TIME_EVENT;
    if last.logflag then TIME_INTER = 0;
run;