2014-06-23 98 views
0

所以我有一個數據集,其中包含一個股票ID和一個date_time變量等。我想從下一個date_time刪除date_time變量爲30分鐘的所有觀察值,並且股票是相同的。因此,如果我的數據集看起來像這樣:刪除觀察相隔一段時間

Date_Time|Stock_ID 
01APR11: 07:50:00|Treasury 
01APR11: 07:51:00|Treasury 

這兩個意見將被刪除。到目前爲止,我正試圖用dif和lag函數標記它們的刪除。這是我的代碼

data 3; 
set 2; 
time_diff=dif(Date_Time)/60; 
same_stock=lag(Stock); 
delete=.; 
if abs(time_diff)<=30 AND same_stock=Stock_ID then delete=1; 
run; 

在此之後,我可以刪除所有觀察值,其中delete = 1。 問題是,我不認爲這個代碼是非常有效的,它肯定容易出錯,特別是如果有三個日期時間全部相鄰。

必須有更好的方法來做到這一點。

+0

您希望如何處理大於60分鐘的相同庫存的一系列條目,但所有條目少於相隔10分鐘?全部刪除它們? – user667489

+0

是的,我想將它們全部刪除。 – Pcarlitz

+0

我真的不認爲你現有的方法太糟糕了,除非你的數據集很大,並且你迫切希望避免多讀一遍。數據集是否按特定順序排序? – user667489

回答

0

我說原來的解決方案的危險方面是,它是 按時間順序股票不讀書的記錄,因此刪除可以通過在源數據記錄順序的影響。

我建議: 1)通過處理datastep按照時間順序 2)如果性能是至關重要的,我只輸出最終的記錄(一旦邏輯是正確的)

順便說一句,我不知道你真的使用數字作爲表名。

/* sort data */ 
proc sort data=d2; 
by stock Date_Time; 
run; 

/* or create index */ 
proc sql; 
create index idx1 on d2 (stock Date_Time); 
quit; 

/* or create view and use V2 instead of D2 */ 
proc sql; 
create view V2 as select * from D2 order by stock Date_Time; 
quit; 

data d3; 
set d2 /* or use V2 if created the view */; 
by stock Date_Time; 
    if first.stock = 1 then output;/* first row always kept for the stock */ 
    else do; 
     time_diff=dif(Date_Time)/60; 
     if time_diff > 30 then output; 
    end; 
run; 

更新(沒有嘗試)從上刪除所有記錄距離小於30秒保持記錄:

data d3; 
set d2 /* or use V2 if created the view */; 
retain last_kept_dt; 
by stock Date_Time; 
    if first.stock = 1 then do; 
     last_kept_dt = Date_Time; 
     output;/* first row always kept for the stock */ 
    end; 
    else do; 
     time_diff = (Date_Time - last_kept_dt)/60; 
     if time_diff > 30 then do; 
      output; 
      last_kept_dt = Date_Time; 
      end; 
    end; 
run; 
+0

我實際上並沒有使用數字作爲表名......只是爲了舉例!謝謝你的幫助。我想刪除所有相隔30分鐘的行,而不僅僅是其中的一行......你知道這是否可能嗎?例如,如果我有兩隻股票交易25分鐘,我想刪除它們兩個。 – Pcarlitz

+0

我得到一個錯誤,說明do循環沒有正確關閉。我試圖修復結束語句,但它沒有工作......同樣的錯誤。 – Pcarlitz

0

我想通了,這樣做,我認爲作品的一種方式。它添加以下代碼:

proc expand data=3 out=4 method=none; 
convert delete=delete_lead1/transformout=(lead 1); 
run; 

現在,這給了我與我的第一個步驟刪除變量和鉛變量(delete_lead1),這將使一個值到另一行,我需要刪除的數據集。我檢查了所有的觀察結果,它甚至對4或5行起作用,所以我對這個解決方案更有信心。