2016-11-21 59 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

相关问题