2017-03-05 113 views
0

嘿,夥計們,我是新來的,學習python,我覺得我有點不同意這個問題。我正在尋找如何處理的建議。Python CSV文件For循環和日期比較

我有一個主要的csv文件main.csv包含許多字段,但四個重要的是ID,名稱,日期和狀態。爲了澄清,名稱和ID字段不是唯一的。相同的將出現在多行上。

我正在嘗試使用for循環來查看主文件,並通過名稱和ID分析結果,並且在每個獨特的情況下,我想比較日期並選擇未來最遠的日期。

我得到了這個,現在我很掙扎。下面是我的腳本和輸出至今

腳本


import csv 

s=open('combined.csv') 
mainfile = csv.reader(s) 

id = ['1','4'] 
Name = ['Anthony', 'Bob'] 
Status = ['New', 'Old'] 

for r in mainfile: 
    for m in Name: 
     for t in id: 
      if r[10] in (None, ""): 
       pass 
      elif r[3] == m: 
       if r[5] == t: 
        print (r[3], r[5], r[6], r[11]) 

輸出例如:

('Anthony', '1', '10', '4/3/2017') 
('Anthony', '1', '11', '5/2/2017') 
('Anthony', '1', '13', '12/30/2017' 
('Anthony', '1', '15', '8/20/2017') 
('Anthony', '4', '17', '2/3/2018') 
('Anthony', '4', '18', '3/28/2017') 
('Bob', '1', '111', '4/3/2017') 
('Bob', '1', '200', '5/2/2017') 
('Bob', '1', '113', '12/30/2017') 
('Bob', '1', '115', '8/20/2017') 
('Bob', '4', '117', '2/3/2018') 
('Bob', '4', '118', '3/28/2017') 

我就要掛了,因爲我不想看的地方名稱和ID字段是唯一的,並將所有這些日期進行比較,並在將來每打印一份文件時,返回將來最遠的日期。

任何人都可以幫忙嗎?

+0

如果文件中有Charles,該怎麼辦? – Goyo

+0

名稱列表將在之前填充,因此輸出中的唯一名稱將是我已經在該列表中定義的名稱。我只是現在測試,但最終會有26個唯一的名稱 – Anthony

回答

0

您需要使用datetime.strptime方法和sortedkey參數。

from datetime import datetime 

def get_date(date): 
    return datetime.strptime('%m/%d/%Y', date) 

ids = ('1', '4') 
names = ('Anthony', 'Bob') 
lines = [] 

with open('combined.csv', 'r', newline='') as s: 
    mainfile = csv.reader(s) 

    for r in mainfile: 
     if r[10] and r[3] in names and r[5] in ids: 
      lines.append((r[3], r[5], r[6], r[11])) 

lines = sorted(lines, key=lambda line: get_date(line[3])) 

for line in lines: 
    print(line) 

就像這樣。未經測試。

+0

Traceback(最近呼叫的最後一個): 文件「new.py」,第21行,在 lines = sorted(lines,key = lambda (行[3])) 文件「new.py」,第21行,在 lines = sorted(行,鍵= lambda行:get_date(行[3])) 文件「new.py」 ,第6行,在get_date中 return datetime.strptime('% - m /% - d /%Y',日期) _strptime中的第332行文件「H:\ Anaconda2 \ lib \ _strptime.py」(data_string ,格式)) ValueError:時間數據'%-m /% - d /%Y'與格式不匹配'4/3/2017' – Anthony

+0

我收到一個錯誤,因爲10以下的月份應該有0,他們不會「T。該功能可以修改,所以它不會尋找? – Anthony

+0

Thyrst,我正在更多地查看你的代碼,我不認爲這是行得通的,因爲我正在尋找不僅僅是一個返回的多行。含義名稱和ID字段匹配的所有內容我想查看所有日期並獲取最新信息。這意味着在我的示例代碼上面應該有4行返回。 Anthony-1,Anthony-4,Bob-1和Bob-4 – Anthony