2017-03-05 14 views
0

こんにちは私は新しいですし、Pythonを学ぶと私はこの質問で私のリーグから少しだと感じる。私はどのように対処するためのアドバイスを探しています。Python CSVファイルforループと日付比較

メインのcsvファイルmain.csvには多くのフィールドが含まれていますが、重要な4つのID、名前、日付、ステータスが重要です。明確にするために、名前とIDフィールドは一意ではありません。同じものが複数の行に表示されます。

私は、メインファイルを通過し、名前とIDで結果を突き止めるためにforループを使用しようとしています。そして、それぞれのユニークなケースで、日付を比較し、将来最も遠いものを選びたいと思います。

私はこれを遠くに持っていて、今私は苦労しています。以下は私のスクリプトと出力は、これまで

スクリプトです


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

ファイルにチャールズがある場合はどうなりますか? – Goyo

+0

Nameリストは事前に入力されているので、出力内の唯一の名前は既にそのリストで定義されている名前になります。私はちょうど今テスト中ですが、最終的に26ishのユニークな名前があります – 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

トレースバック(最新のコール最後): ファイル "new.py"、21行目、 行=ソート済み(行、キー=ラムダ ファイル "new.py"、行21、 行=ソート(行、キー=ラムダ行:get_date(行[3]) ファイル "new.py" 、行6、get_dateに return datetime.strptime( '% - m /% - d /%Y'、日付) ファイル "H:\ Anaconda2 \ lib \ _strptime.py"、行332、_strptimeで (data_string 、format)) ValueError:時刻データ '%-m /%-d /%Y'は'2011年4月3日 'の形式と一致しません – Anthony

+0

10歳未満の月が0で、 't。関数がそれを探していないように修正することはできますか? – Anthony

+0

Thyrst、私はあなたのコードをもっと見ていました。私は複数の行が返されるのを探しているので、これはうまくいくとは思わない。意味すべての名前とIDのフィールドが一致私はすべての日付を見て、最新のものを取りたいです。上記の私のコード例では、4行が返されるはずです。アンソニー1、アンソニー4、ボブ1、ボブ4 – Anthony