2014-03-12 63 views
0

下面,您可以找到時間序列的摘錄。我想切割由空白區分開的行(白色區域是爲了清晰起見,數據中沒有空行)。有一個重複出現的模式,即21次X值,4次不同值ABCD,21次Y值,4次不同值EFGH,21次Z值等。在這種情況下,我有興趣獲得BCDY,FGHZ等。根據不規則圖案切片

問題是這種模式有時會因缺失數據而中斷,使其不規則。結果,我想丟棄的值的數量(值X,Y,Z)有時低於21。 2014-01-20 00:05:00和2014-01-20 00:11:00之間的值也可能會丟失。

我可以考慮循環播放這個系列,但我更喜歡矢量化的方法。我想在R中實現它,但是Python或Matlab也可以。

任何想法?謝謝。

2014-01-20 00:00:00 197021 
2014-01-20 00:01:00 197021 
2014-01-20 00:02:00 197021 
2014-01-20 00:03:00 197021 
2014-01-20 00:04:00 197021 
2014-01-20 00:05:00 197021 
2014-01-20 00:06:00 197021 
2014-01-20 00:07:00 197021 
2014-01-20 00:08:00 197021 
2014-01-20 00:09:00 197021 
2014-01-20 00:10:00 197021 
2014-01-20 00:11:00 197021 
2014-01-20 00:12:00 197021 
2014-01-20 00:13:00 197021 
2014-01-20 00:14:00 197021 
2014-01-20 00:15:00 197021 
2014-01-20 00:16:00 196836 

2014-01-20 00:17:00 196865 
2014-01-20 00:18:00 196787 
2014-01-20 00:19:00 196915 
2014-01-20 00:20:00 196902 

2014-01-20 00:21:00 196902 
2014-01-20 00:22:00 196902 
2014-01-20 00:23:00 196902 
2014-01-20 00:24:00 196902 
2014-01-20 00:25:00 196902 
2014-01-20 00:26:00 196902 
2014-01-20 00:27:00 196902 
2014-01-20 00:28:00 196902 
2014-01-20 00:29:00 196902 
+0

缺失的數據是什麼樣的?因爲否則,它聽起來像是你只想從第27行開始的25行組(即Matlab中的'BCDY = data(27:27 + 25,:)') – Dan

+1

你能以方便的方式與我們分享數據嗎?這裏有一些關於如何做到這一點的提示:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example我打賭'rle'將成爲最終解決方案的一部分,雖然。 –

+0

爲什麼在''00:16:00 196836''和''00:17:00 196865''之間有空格?我明白這個白色空間實際上並不存在,真正的問題是:什麼區分一個時間序列和下一個時間序列? – eyquem

回答

1

如果我明白你的意思,你想刪除最後一列與上一行不變的所有數據行。在Matlab中,您可以使用diff()函數和邏輯索引來執行此操作。假設你的數據是在兩列矩陣中,則表達式

data([true; diff(data(:,2))~=0],:) 

將返回一個只有滿足要求的數據的兩列矩陣。您可能需要分別檢查第一行:從描述中我不太清楚您是否總是需要第一行。以上將始終保持。將true更改爲false以始終將其刪除。

編輯(響應於第一評論)

在上述表達式與false更換true丟棄的第一行。這給你留下5行的塊,你想放棄每塊中的第一行。這也可以通過邏輯索引來完成。這是相當簡單的,除了你需要保護的情況下,當最後一個塊包含少於5行:

pData = data([false; diff(data(:,2))~=0],:); 
selector = repmat([false; true; true; true; true], ceil(size(pData, 1))/5, 1); 
pData = pData(selector(1:size(pData,1)),:); 

我希望這有助於!

+0

這越來越接近,但它會導致5個值與之前的一系列等值不同。我也想忽視第一個改變的值。最後,我想在第一次更改值後保留這四個值。 – user2143353

1

我很尷尬地解釋下面的代碼的邏輯,因爲它似乎對我很明顯。
如果需要精確度,請問我。

我只是給出這個解釋:
你寫了「我想丟棄的值的數量(值X,Y,Z)有時低於21。
在我的代碼,我所做的假設是,這個較低的次數不能遜色於3

使用的StringIO不是必需的,它只是給我的難易程度呈現代碼按原樣運行,處理代碼中包含的數據。
唯一的要求是將一個迭代函數傳遞給函數slik():它可以是一個生成器,如以下代碼或文件處理程序或列表或任何其他可以迭代的函數。

爲了讓執行指令不會向下滾動而出現,我分割了代碼,但這兩個部分必須在同一個coe中運行。

text = ''' 
2014-01-20 00:00:00 197021 
2014-01-20 00:01:00 197021 
2014-01-20 00:02:00 197021 
2014-01-20 00:03:00 197021 
2014-01-20 00:04:00 197021 
2014-01-20 00:05:00 197021 
2014-01-20 00:06:00 197021 
2014-01-20 00:07:00 197021 
2014-01-20 00:08:00 197021 
2014-01-20 00:09:00 197021 
2014-01-20 00:10:00 197021 
2014-01-20 00:11:00 197021 
2014-01-20 00:12:00 197021 
2014-01-20 00:13:00 197021 
2014-01-20 00:14:00 197021 
2014-01-20 00:15:00 197021 
2014-01-20 00:16:00 196836 
2014-01-20 00:17:00 196865 
2014-01-20 00:18:00 196787 
2014-01-20 00:19:00 196915 
2014-01-20 00:20:00 196902 
2014-01-20 00:21:00 196902 
2014-01-20 00:22:00 196902 
2014-01-20 00:23:00 196902 
2014-01-20 00:24:00 196902 
2014-01-20 00:25:00 196902 
2014-01-20 00:26:00 196902 
2014-01-20 00:27:00 196902 
2014-01-20 00:28:00 196902 
2014-01-20 00:29:00 196902 
''' 

from StringIO import StringIO 
rid = (x.strip() for x in StringIO(text)) 

def slik(INPUT): 
    from collections import deque 
    rows = deque(((x for x in INPUT if x).next(),) , maxlen=10) 
    rows.extend (INPUT.next() for i in xrange(8)) 
    val = deque((x.rsplit(None,1)[1] for x in rows), maxlen=10) 
    for x in INPUT: 
     rows.append(x) 
     val.append(x.rsplit(None,1)[1]) 
     if val[0]==val[1]==val[2] != val[7]==val[8]==val[9]: 
      for i in (3,4,5,6,7): yield rows[i] 

print '\n'.join(slik(rid))