2015-06-25 19 views
0

我有一个嵌套列表,其中包含不同的变量。我试图检查两个连续项目之间的差异值,如果条件匹配,将这些项目组合在一起。Python中的列表中的值差异比较

Item 1 happened on 1-6-2012 1 pm 
Item 2 happened on 1-6-2012 4 pm 
Item 3 happened on 1-6-2012 6 pm 
Item 4 happened on 3-6-2012 5 pm 
Item 5 happened on 5-6-2012 5 pm 

欲组具有间隙小于24小时的项目。在这种情况下,项目1,2和3属于一个组,项目4属于一个组,项目5属于另一个组。我试了下面的代码:

Time = [] 
All_Traps = [] 
Traps = [] 
Dic_Traps = defaultdict(list) 
Traps_CSV = csv.reader(open("D:/Users/d774911/Desktop/Telstra Internship/Working files/Traps_Generic_Features.csv")) 
for rows in Traps_CSV: 
    All_Traps.append(rows) 

All_Traps.sort(key=lambda x: x[9]) 
for length in xrange(len(All_Traps)): 
     if length == (len(All_Traps) - 1): 
      break 
     Node_Name_1 = All_Traps[length][2] 
     Node_Name_2 = All_Traps[length + 1][2] 
     Event_Type_1 = All_Traps[length][5] 
     Event_Type_2 = All_Traps[length + 1][5] 
     Time_1 = All_Traps[length][9] 
     Time_2 = All_Traps[length + 1][9] 
     Difference = datetime.strptime(Time_2[0:19], '%Y-%m-%dT%H:%M:%S') - datetime.strptime(Time_1[0:19], '%Y-%m-%dT%H:%M:%S') 
     if Node_Name_1 == Node_Name_2 and \ 
      Event_Type_1 == Event_Type_2 and \ 
      float(Difference.seconds)/(60*60) < 24: 
      Dic_Traps[length].append(All_Traps[Length]) 

但我错过了一些项目。想法?

+0

这些项目是否已经排序?另外一些示例数据可能会有帮助基本上 - 转换为'datetime'对象 - 并比较'timedelta' – gabhijit

+0

@ user2566898如果他们帮助你,请接受答案。 –

回答

1

对于排序列表,您可以使用groupby。下面是一个简单的例子(您应该将日期字符串转换为datetime对象),也应该给主要的想法:

from itertools import groupby 
import datetime 

SRC_DATA = [ 
    (1, datetime.datetime(2015, 06, 20, 1)), 
    (2, datetime.datetime(2015, 06, 20, 4)), 
    (3, datetime.datetime(2015, 06, 20, 5)), 
    (4, datetime.datetime(2015, 06, 21, 1)), 
    (5, datetime.datetime(2015, 06, 22, 1)), 
    (6, datetime.datetime(2015, 06, 22, 4)), 
] 

for group_date, group in groupby(SRC_DATA, key=lambda X: X[1].date()): 
    print "Group {}: {}".format(group_date, list(group)) 

输出:

$ python python_groupby.py 
Group 2015-06-20: [(1, datetime.datetime(2015, 6, 20, 1, 0)), (2, datetime.datetime(2015, 6, 20, 4, 0)), (3, datetime.datetime(2015, 6, 20, 5, 0))] 
Group 2015-06-21: [(4, datetime.datetime(2015, 6, 21, 1, 0))] 
Group 2015-06-22: [(5, datetime.datetime(2015, 6, 22, 1, 0)), (6, datetime.datetime(2015, 6, 22, 4, 0))] 
0

首先,改变那些可怕的套管变量名。 Python有自己的命名变量,类,方法等惯例。这就是所谓的蛇案。现在

,到你需要做什么:

import datetime as dt 
import pprint 

ts_dict = {} 

with open('timex.dat', 'r+') as f: 
     for line in f.read().splitlines(): 
       if line: 
        item = line.split('happened')[0].strip().split(' ')[1] 
        timestamp_string = line.split('on')[-1].split('pm')[0] 
        datetime_stamp = dt.datetime.strptime(timestamp_string.strip(), "%d-%m-%Y %H") 
        ts_dict[item] = datetime_stamp 

这是给你这样的hackish的方式:

item_timestamp_dict= { 
'1': datetime.datetime(2012, 6, 1, 1, 0), 
'2': datetime.datetime(2012, 6, 1, 4, 0), 
'3': datetime.datetime(2012, 6, 1, 6, 0), 
'4': datetime.datetime(2012, 6, 3, 5, 0), 
'5': datetime.datetime(2012, 6, 5, 5, 0)} 

项目#作为关键一本字典,以及它们的日期时间的时间戳作为价值。

您可以使用日期时间戳记值“item_timestamp_dict['1'].hour”来进行计算。

编辑:它可以优化很多。