2016-11-21 60 views
0

我試圖從列表中獲取列表中的日期和數字列表,並從電子表格中拉出,並創建一個字典列表,其中每個條目是開始日期,停止日期和價值。樣本數據是這樣的:從列表中創建圖表數據(帶有開始/停止日期)

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]] 

我需要什麼(用於日後轉換爲甘特圖)是這樣的輸出:

{'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'} 

我越來越近,但我想不通了解如何包含最後一個值(是的,它們是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

您的代碼將永遠不會達到去年elif條件,elif x == len(d) - 1:因爲以前你檢查這兩個ipAdd == lastIPipAdd != lastIP in if ipAdd == lastIP or x == 0: and elif ipAdd != lastIP: condition。所以,我想你已經添加了最後的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)之外測試循環變量。它修復了最後一項的問題,但我仍然得到不正確的輸出。第二個50的值應該有11/13的開始日期,而不是11/14。我認爲這是一個相關的問題,但我猜不是。 – bgrundy

+0

@bgrundy現在我已經瞭解你的問題了。我已經更新了代碼,現在它提供了所需的輸出。如果它可以幫助你,那麼接受答案:) –

+0

是的,這是做到了。第二個錯誤是在增加x之後附加日期*。很簡單。謝謝。 – bgrundy

相關問題