2017-07-18 11 views
-1

時系列の時間と値を持つ2つのリストがあります。 NAN値が時系列でどこにあるかを識別するブール値を含む対応するリストがあります。私がする必要があるのは、True値(つまりNAN値)が5回(行NAN値6)繰り返され、リストが2つに分割された場合(シーケンスの開始時と終了時にNAN値がないためです基本的には、リストをNL値が6個以上含まれているギャップがあったところで開始と終了する小さなリストのリストに分割する必要があります。ブール値が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: 

私は最善の方法は、ここから行くためには何か本当にわからないんだけど、私はより良い方法があると確信している。

は、その後、私は何をする必要があるか、繰り返しの発生のためでありますNAN値が5回未満(6 NAN値の行)繰り返される場合は、これらの値をscipyのb-splineを使って計算された値。私はこれについてどうやって行くのかについてはあまりよく分かりません。ありがとう!

+1

コードの貼り付けがコードの記述よりも優れているとは思いませんか? –

+1

あなたの質問を書いてください:段落を使用し、例を使用してください...あなたはそのような質問を読んでみませんか? –

+0

申し訳ありませんが、それは少し明確ですか? –

答えて

0

私があなたのことを理解していれば、他のリスト(同じ長さのリストを想定しています)のインデックスに基づいて1つのリストを分割して、その他のリストの要素を繰り返すことでスライスの発生場所を定義します。 'エレガントな'が、最もパフォーマンスの良い方法ではなく、他のリストの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_dataリストにnan_len連続しTrue値(またはTrueに評価された値)に基づいて、任意の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']] 
関連する問題