2016-11-21 15 views
0

リストの日付と数字のリストをスプレッドシートから取り出し、辞書のリストを作成しようとしています開始日、停止日、および値です。私が近づいていますが、私は理解することはできませんリストのリストからチャートデータを作成する(開始日/終了日を含む)

{'start': '11/01/2016', 'end': '11/02/2016', 'IP': '50'} 
{'start': '11/02/2016', 'end': '11/09/2016', 'IP': '23'} 
{'start': '11/09/2016', 'end': '11/09/2016', 'IP': '66'} 
{'start': '11/13/2016', 'end': '11/14/2016', 'IP': '50'} 
{'start': '11/15/2016', 'end': '11/21/2016', 'IP': '100'} 
{'start': '11/23/2016', 'end': '11/24/2016', 'IP': '50'} 

:私は(ガントチャートに後で変換のために)必要なもの

d = [[datetime.datetime(2016, 11, 1, 0, 0), 50L], 
[datetime.datetime(2016, 11, 2, 0, 0), 50L], 
[datetime.datetime(2016, 11, 2, 0, 0), 50L], 
[datetime.datetime(2016, 11, 2, 0, 0), 23L], 
[datetime.datetime(2016, 11, 2, 0, 0), 23L], 
[datetime.datetime(2016, 11, 2, 0, 0), 23L], 
[datetime.datetime(2016, 11, 7, 0, 0), 23L], 
[datetime.datetime(2016, 11, 8, 0, 0), 23L], 
[datetime.datetime(2016, 11, 9, 0, 0), 23L], 
[datetime.datetime(2016, 11, 9, 0, 0), 23L], 
[datetime.datetime(2016, 11, 9, 0, 0), 66L], 
[datetime.datetime(2016, 11, 9, 0, 0), 66L], 
[datetime.datetime(2016, 11, 13, 0, 0), 50L], 
[datetime.datetime(2016, 11, 14, 0, 0), 50L], 
[datetime.datetime(2016, 11, 15, 0, 0), 100L], 
[datetime.datetime(2016, 11, 16, 0, 0), 100L], 
[datetime.datetime(2016, 11, 17, 0, 0), 100L], 
[datetime.datetime(2016, 11, 17, 0, 0), 100L], 
[datetime.datetime(2016, 11, 17, 0, 0), 100L], 
[datetime.datetime(2016, 11, 20, 0, 0), 100L], 
[datetime.datetime(2016, 11, 21, 0, 0), 100L], 
[datetime.datetime(2016, 11, 21, 0, 0), 100L], 
[datetime.datetime(2016, 11, 23, 0, 0), 50L]] 

は次のように出力されます。サンプルデータは、次のようになります最後の値を含める方法を示します(はい、IPアドレスです。私のテストでは読みやすくするために短縮されています)。私の現在のコードでは、最後のアイテムの日付も崩れます。

そして、ここで私が取得していますものです:

{'start': '11/01/2016', 'end': '11/02/2016', 'IP': '50'} 
{'start': '11/02/2016', 'end': '11/09/2016', 'IP': '23'} 
{'start': '11/09/2016', 'end': '11/09/2016', 'IP': '66'} 
{'start': '11/14/2016', 'end': '11/14/2016', 'IP': '50'} 
{'start': '11/16/2016', 'end': '11/21/2016', 'IP': '100'} 

はここで、これまでに私のコードです:

df = [] 
fmtD = '%m/%d/%Y' 
dates = [] 
lastIP = 0 

for x in range(len(d)): 
     ipAdd = d[x][1] 
     if ipAdd == lastIP or x == 0: 
       dates.append(d[x][0]) 
     elif ipAdd != lastIP: 
       df.append(dict(IP = str(lastIP),\ 
           start=min(dates).strftime(fmtD),\ 
           end = max(dates).strftime(fmtD))) 
       dates = [] 
     elif x == len(d): 
       df.append(dict(IP = str(lastIP),\ 
           start=min(dates).strftime(fmtD),\ 
           end = max(dates).strftime(fmtD))) 
     lastIP = ipAdd 

for item in df: 
     print item 
+0

あなたが取得しているどのような出力?あなたが何を期待しているのか、何を得ているのかを理解できるように、それを示してください! –

+0

ありがとうございます。現在の出力を追加しました。 – bgrundy

答えて

1

以前にあなたが両方ipAdd == lastIPをチェックするので、あなたのコードは最後elif条件、elif x == len(d) - 1:に到達することはありませんし、 ipAdd != lastIPif ipAdd == lastIP or x == 0:およびelif ipAdd != lastIP:の状態。だから、最後のelif条件を追加してリストの最後の項目をdfに追加したと思います。したがって、それはforループの外側に配置する必要があります。またelif ipAdd != lastIP:の中のdatesリストをリセットした後、あなたは日付の現在の値を保存していませんでした!ステートメントを追加すると、dates.append(d[x][0])が問題を解決します。

全体として、以下の方法でコードを修正して、目的の出力を達成することができます。

for x in range(len(d)): 
    ipAdd = d[x][1] 
    if ipAdd == lastIP or x == 0: 
     dates.append(d[x][0]) 
    elif ipAdd != lastIP: 
     df.append(dict(IP = str(lastIP),\ 
         start=min(dates).strftime(fmtD),\ 
         end = max(dates).strftime(fmtD))) 
     dates = [] 
     dates.append(d[x][0]) 
    lastIP = ipAdd 

if x == len(d) - 1: 
    df.append(dict(IP = str(lastIP),\ 
        start=min(dates).strftime(fmtD),\ 
        end = max(dates).strftime(fmtD))) 
for item in df: 
    print item 

それは印刷されます(あなたが期待通りに)

{'start': '11/01/2016', 'end': '11/02/2016', 'IP': '50'} 
{'start': '11/02/2016', 'end': '11/09/2016', 'IP': '23'} 
{'start': '11/09/2016', 'end': '11/09/2016', 'IP': '66'} 
{'start': '11/13/2016', 'end': '11/14/2016', 'IP': '50'} 
{'start': '11/15/2016', 'end': '11/21/2016', 'IP': '100'} 
{'start': '11/23/2016', 'end': '11/23/2016', 'IP': '50'} 
+0

ありがとうございます。私はループ変数(x)の外側でループ変数をテストすることは決して実現しませんでした。それは最後の項目の問題を解決しますが、私はまだ間違った出力を取得します。 2番目の値50の開始日は11/13で、11/14ではありません。私はそれが関連する問題だと思ったが、私はそうは思わない。 – bgrundy

+0

@bgrundy今あなたの問題を理解しました。私はコードを更新して、現在は望ましい出力を与えています。それがあなたを助けたら、答えを受け入れる: –

+0

はい、それはそれをしました。 2番目のエラーは、xをインクリメントした後の*を付けることからでした。とても簡単。ありがとう。 – bgrundy

関連する問題