2017-03-05 115 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