2012-07-17 28 views
0

我有兩個列表列表,一個列表包含兩個日期和一個ID號,另一個列表包含許多信息,包括一個ID號和一個日期。我需要找出這個日期是否在每個ID號的另外兩個日期之間,如果是,請將它寫入一個新列表。更簡單地說,對於每個ID號碼,如果日期在另外兩個日期之間,則將信息寫入新列表。目前,所有名單都被列入新名單,這是錯誤的(並不是所有的日期都在其他兩次之間)。確保for循環的每次迭代中只有一個列表從嵌套列表中使用

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 

我想可能發生的是,迄今[2],日期[0]和日期[1]是不是都來自同一個列表,每次進來datepairs循環運行,或者事情錯了與身份證號碼。 對不起,如果這不是特別清楚。謝謝你的幫助!

編輯: 這是我如何將日期轉換爲日期時間對象,這是在上面的代碼之前完成的。

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

比較「MM/DD/YYYY」日期,字母是一個非常糟糕的主意。首先將其轉換爲'datetime'對象,或者至少將其重構爲'YYYYMMDD'。 – eumiro 2012-07-17 14:45:25

+0

在腳本的前面,我將所有日期轉換爲datetime對象,以DD MM YY格式獲取它們,以便它們更易於比較。這有幫助嗎? :/ – Snaaa 2012-07-17 14:51:35

+1

轉換在哪裏?您將日期顯示爲會影響解決方案的字符串。 – RobB 2012-07-17 14:52:42

回答

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所說的重要,因此您應該將日期保存爲日期時間對象,您可以使用datetime.strptime來執行此操作。您可以在那裏找到將字符串日期轉換爲日期時間對象的格式。即: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列表中的所有信息,但可以很容易地添加到字典中。

+0

感謝您的幫助:)我努力讓這個工作,我想因爲我仍然不懂字典。這增加了4個items_views_between_dates,所有這些都是由幾百個日期。不知道我要去哪裏錯.. – Snaaa 2012-07-18 09:35:55

+0

這裏是一個關於[字典]的好教程(http://yuji.wordpress.com/2008/05/14/python-basics-of-python-dictionary-and-looping -通過他們/)。它會讓你更容易,我向你保證。還試着理解我發佈和修改的代碼,我沒有嘗試過,可能有一些錯誤,但解決方案的主要想法是 – Hassek 2012-07-18 15:42:32

+0

該教程比我發現的其他任何人都好,謝謝!並感謝所有的幫助,玩弄代碼正在使一切更清晰:) – Snaaa 2012-07-19 09:08:37

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) 

同一格式,那麼你的「訪問在MV」循環應該工作

+0

感謝您的幫助。我編輯了這個問題來說明我如何格式化日期,您的方法是否更有效?我不知道如何判斷它 – Snaaa 2012-07-18 14:40:55