2017-07-18 77 views
-1

我有兩個列表,它們具有時間序列的時間和值。有一個相應的列表,其中包含布爾值,用於標識NAN值在時間序列中的位置。我需要做的是,如果真值(即NAN值)重複5次以上(一行中有6個NAN值),將列表分成兩部分(在序列的開始和結束處,因此沒有NAN值所以基本上,我需要將列表拆分成一個小列表的列表,這些列表開始和結束的地方有一個包含6個以上重複的NAN值的間隙,我嘗試了以下幾行:在布爾值重複n次的點處的分割列表

for i in range(len(nan_list)-5): 
     if nan_list[i] == True and nan_list[i+1] == True and nan_list[i+2] == True and nan_list[i+3] == True and nan_list[i+4] == True and nan_list[i+5] == True: 

我真的不知道最好的辦法就是從這裏走什麼,我敢肯定有一個更好的辦法。

那我需要做的,是重複的發生重複少於5次的NAN值(連續6個NAN值),用這些值替換從scipy使用b-spline計算的值。我不太清楚如何去做這件事。謝謝!

+1

難道你不覺得粘貼代碼比描述代碼好嗎? –

+1

請格式化您的問題:使用段落,使用示例,...您想閱讀這樣的問題嗎? –

+0

對不起,是否更清楚一點? –

回答

0

如果我理解你correclty,你想根據另一個列表(假設是一個長度相同的列表)以這樣一種方式拆分一個列表,即在另一個列表中重複元素定義切片應該發生的位置。一個'優雅',但不是最高性能的方法是迭代通過n大小的其他列表的切片,並檢查當前索引是否爲all(nan_list[i:i+n]) - 如果是,請將該索引之前的第一個列表中的所有內容作爲切入您的結果,然後跳過n地點並重復該過程。然而,我寧願一個程序的方法:

def split_list(source, nan_data, nan_len=6): 
    result = [] # a list for our final result 
    last_pos = 0 # holds the last sliced position 
    counter = 0 # a counter for sequential NaNs 
    for i, is_nan in enumerate(nan_data): 
     if not is_nan: # encountered a non-NaN, check how many consecutive NaNs we had 
      if counter >= nan_len: # we have a match... 
       result.append(source[last_pos:i-counter]) # add a new slice to our result 
       last_pos = i # set the new slice position 
      counter = 0 # reset the counter 
     else: 
      counter += 1 # NaN found, increase the counter 
    # find the last slice, if any 
    left_over = source[last_pos:] if counter < nan_len else source[last_pos:-counter] 
    if left_over: 
     result.append(left_over) 
    return result # return the result 

然後你可以用它來分割基於nan_len連續True值(或計算結果爲真實的任何值)在nan_data列表中的任何source列表,例如:

base_list = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", 
      "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] 
nan_list = [True, False, True, False, True, True, True, True, True, True, 
      False, True, False, True, True, False, True, True, True, False] 

print(split_list(base_list, nan_list, 3)) 
# [['01', '02', '03', '04'], ['11', '12', '13', '14', '15', '16'], ['20']]