在SAS

2016-07-12 67 views
2

從時間戳計算時間間隔,我有一些數據:在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; 

我希望得到一些數據,看起來像這樣,我就指望步驟之間的時間,但此時計數器重置爲0每第一個活動1出現的時間;

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; 

從這我只是得到一個空白字段。

任何人都可以幫忙嗎?

+0

您是否有任何輸入數據?或只有數據? –

+1

時間值的含義是什麼? '07:03:875'看起來不像是表示時間的有效方式。這不是H:M:S,因爲你怎麼能有875秒?也許前兩部分是分和秒,最後一部分是毫秒?如果是這樣的話,爲什麼它以':'而不是'''爲前綴? – Tom

回答

1

事實證明,我的TIME_EVENT字段實際上是一種字符格式,所以必須重新將其作爲時間數據類型。另外,我僅在最後一類活動開始時有一個時間戳記,所以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; 
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固定在每行和固定在當前行之前它已經從以前的行的值。

+0

謝謝@andrey_sz。我已經運行這個,我得到的每個first.ID都是0。 _prev是SAS功能嗎?我如何設置TIME_EVENT_prev等於什麼? :-) – Taylrl

+0

不,_prev不是函數。嘗試刪除'drop = TIME_EVENT_prev'並查看每行的值。另外,TIME_EVENT的格式是什麼?文本? –

+0

我認爲我在這裏遇到的問題是TIME_EVENT實際上是文本。還有辦法做到這一點?我需要首先更改數據類型嗎? – Taylrl