0

我有两个列表列表,一个包含两个日期和一个 ID 号,另一个包含很多信息,包括一个 ID 号和一个日期。我需要查找该日期是否在每个 ID 号的其他两个日期之间,如果是,请将其写入新列表。更简单地说,对于每个 ID 号,如果某个日期介于其他两个日期之间,则将信息写入一个新列表。目前,所有列表都被放入新列表中,这是错误的(并非所有日期都在其他两个日期之间)。

mv = [['05/13/2012', '09:54:27', 'U', '#0F', '0006E3DADA', 'T', 'Un\n', 'F3', '13 05 12'], 
      ['05/13/2012', '09:54:28', 'U', '#0F', '0006E3DADA', 'T', 'Un\n', 'F3', '13 05 12'],
      etc]

对于 mv,这是我感兴趣的列表中的最后一个日期。

datepairs = [['21 05 01', '04 06 01', 'C1'], 
             ['27 07 06', '10 08 06', 'C1'],
             etc]

这些是 mv 的日期必须介于两者之间的两个日期。

visitsbetweendates=[]
for visit in mv:
    for date in datepairs1:
        if date[2]==visit[7]: #if the id number is the same in both lists
            if date[0]<= visit[8] <= date[1]: #if the visit date is between the datepair dates
               if visit not in visitsbetweendates: #if the list is unique
                    visitsbetweendates.append(visit)
                break

我认为可能发生的是 date[2]、date[0] 和 date[1] 并不是每次循环运行时都来自 datepairs 中的同一个列表,或者 id 编号出现问题。如果这不是特别清楚,我很抱歉。谢谢你的帮助!

编辑: 这是我将日期转换为日期时间对象的方法,这是在上面的代码之前完成的。

from datetime import datetime
for v in mv:
    e=datetime.strptime(visit[0],'%m/%d/%Y')
    s=e.strftime('%d %m %y')
    visit.append(s)    
datepairs1=[]
for date in datepairs:
    d=datetime.strptime(str(date[0]),' %d %b %y')
    f=datetime.strptime(str(date[1]),' %d %B %Y')
    e=d.strftime('%d %m %y')
    g=f.strftime('%d %m %y')
    gah=[e,g,date[2].strip(' ')]
    datepairs1.append(gah)
4

2 回答 2

1

首先,我会将两个列表都转换为字典,这将使代码更有效率,因为您不必每次开始搜索不同的键时都重新循环 datepairs1 列表,所以这就是我要做的:

首先将它们转换为字典:

between_dates = dict([(d[2], (d[0], d[1])) for d in datepairs1])
second_dict = {}
for m in mv:
    key = m[7]
    second_dict.setdefault(key ,[])  # this creates the key with an empty list inside if it doesn't exists yet
    second_dict[key].append((m[0], m[8]))

这将以这样的语法结束:

between_dates = {'C1': ('21 05 01', '04 06 01'), ....}
second_dict = {'C1': [('05/13/2012', '13 05 12'), ('05/13/2012', '13 05 12')]}

在两个列表中执行此操作将使搜索更快且更易于调试,现在@eumiro 所说的很重要,因此您应该将日期保存为 datetimes 对象,您可以使用datetime.strptime执行此操作。您可以在那里找到将字符串日期转换为日期时间对象的格式。IE:datetime.strptime('02 06 2011', '%d %m %Y')

所以现在比较一下:

visits_between_dates=[]
for key, bd in between_dates.items():
    if second_dict.get(key, None):  # This will ask if the se
        for sl  in second_dict.values():
            if not sl in visits_between_dates and bd[0]<= sl[1] <= bd[1]:
                visitsbetweendates.append(sl)

也许您需要附加 mv 列表中的所有信息,但可以轻松地将其添加到字典中。

于 2012-07-17T15:46:10.060 回答
1

将日期预处理为可以比较的相同格式

for n in range(0,len(datepairs)):
    (d,m,y)=(datepairs[n][1]).split(" ")
    datepairs[n][1]="%d%s%s" % (2000+int(y),m,d)
    (d,m,y)=(datepairs[n][0]).split(" ")
    datepairs[n][0]="%d%s%s" % (2000+int(y),m,d)

for d in range(0,len(mv)):
    (d,m,y)=(mv[n][0]).split("/")
    mv[n][0]="%s%s%s",(y,m,d)

那么你的“visit in mv”循环应该可以工作

于 2012-07-17T15:51:18.403 回答