将时间戳标记为SAS中的会话

时间:2014-07-15 00:31:39

标签: sas

我有一系列包含两个变量的数据集:uid和timestamp。我想创建一个名为" session_num"的新变量。将时间戳解析为会话号(当两个时间戳相隔30分钟时,它将被标记为新会话)。

例如:

enter image description here

我尝试在sas中使用retain语句循环遍历时间戳,但它没有用。 这是我的代码:

Data test;
SET test1;
By uid;
RETAIN session_num session_len;
IF first.uid THEN DO;
session=1;
session_len=0;
END;
session_len=session_len+timpestamp;
IF timpestamp-session_len>1800 THEN session_num=session_num+1; 
ELSE session_num=session_num;
IF last.uid;
KEEP uid timestamp session_num;
RUN;

真的很感激,如果你能指出我的错误,并建议正确的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:2)

首先,这里是一些示例输入数据(将来,您应该提供自己的代码来生成示例输入数据,以便其他人不必花时间为您执行此操作),

data test;
    input uid$ timestamp : DATETIME.;
    format timestamp DATETIME.;
    datalines;
    a 05jul2014:03:55:00
    a 05jul2014:03:57:00
    a 07jul2014:20:08:00
    a 10jul2014:19:02:00
    a 10jul2014:19:05:00
    a 11jul2014:14:39:00
;

然后您可以使用

创建会话变量
data testsession;
    set test;
    retain last;
    retain session 0;
    by uid;
    if first.uid then do;
        session = session +1;
        last = timestamp;
    end;
    if (timestamp-last)/60>15 then do;
        session = session+1;
    end;
    last = timestamp;
    drop last;
run;

答案 1 :(得分:0)

MrFlick的方法可能是更正常的方法,但另一个选择涉及前瞻自我合并。 (是的,展望未来,即使这应该看起来很落后 - 以这种方式看后面更复杂。)

data want;
  retain session 1; *have to initialize to 1 for the first record!;
  merge have(in=_h) have(rename=(timestamp=next uid=nextuid) firstobs=2);
  output;  *output first, then we adjust session for the next iteration;
  if (uid ne nextuid) then session=1;
  else if timestamp + 1800 < next then session+1;
  drop next:;
run;