【问题标题】:Calculating an interval from a timestamp in SAS从 SAS 中的时间戳计算间隔
【发布时间】:2016-11-14 15:17:22
【问题描述】:

我有一些数据:

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 发生的时间开始计算特定活动发生的时间。我曾考虑通过一个中间步骤来执行此操作,在该步骤中,我创建一个更新以跨越拳头Activity1TIME_EVENT 的字段。这个中间步骤看起来像这样;

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;

从此我得到一个空白字段。

有人可以帮忙吗?

【问题讨论】:

  • 您有输入数据吗?还是只有数据线?
  • 时间值是什么意思? 07:03:875 看起来不像是表示时间的有效方式。它不是 H:M:S,因为你怎么会有 875 秒?也许前两部分是分钟和秒,最后一部分是毫秒?如果是这样,那么为什么它以 : 而不是 . 为前缀?

标签: time sas


【解决方案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 固定在每一行上,在固定在当前行之前,它具有前行的值。

【讨论】:

  • 谢谢@andrey_sz。我已经运行了这个,我得到的只是每个 first.ID 的 0。 _prev 是 SAS 函数吗?如何设置 TIME_EVENT_prev 等于什么? :-)
  • 不,_prev 不是函数。尝试删除 'drop=TIME_EVENT_prev' 并查看每一行的值。另外,TIME_EVENT 的格式是什么?文字?
  • 我认为我在这里遇到的问题是 TIME_EVENT 实际上是文本。还有办法做到这一点吗?我必须先更改数据类型吗?
  • 是的,TIME_EVENT +(-TIME_EVENT_prev) 适用于日期时间格式,差异以秒为单位。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多