2017-03-05 5 views
0

Hey Leute, ich bin neu und lerne Python und ich fühle mich wie ich bin ein wenig außerhalb meiner Liga mit dieser Frage. Ich suche Ratschläge, wie ich damit umgehen soll.Python CSV-Datei Für Loops und Datumsvergleich

Ich habe eine Haupt-csv-Datei main.csv mit vielen Feldern, aber die vier wichtigsten sind ID, Name, Datum und Status. Nur um zu verdeutlichen, sind die Felder Name und ID NICHT EINZIGARTIG. Die gleichen werden in mehreren Zeilen angezeigt.

Ich versuche, eine for-Schleife zu verwenden, um durch die Hauptdatei zu gehen und die Ergebnisse nach Name und ID auszubrechen und in jedem einzelnen Fall möchte ich die Daten vergleichen und die am weitesten in der Zukunft auswählen.

Ich bin so weit gekommen und jetzt kämpfe ich. Unten ist mein Skript und Ausgang so weit

Script


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]) 

Ausgabebeispiel:

('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') 

Ich bin immer aufgehängt, weil ich nicht sehen will, wo die Name und ID-Felder sind eindeutig und vergleichen alle diese Daten und geben das Datum zurück, das in der Zukunft am weitesten zurückliegt, und drucken das dann in eine Datei aus.

Kann jemand helfen?

+0

Was ist, wenn ein Charles in der Datei ist? – Goyo

+0

Die Namensliste wird vorher ausgefüllt, so dass nur die Namen in der Ausgabe definiert werden, die ich bereits in dieser Liste definiert habe. Ich teste gerade jetzt, aber am Ende wird es 26ish eindeutige Namen – Anthony

Antwort

0

Sie müssen datetime mit .strptime Methode und sorted mit key Argument verwenden.

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) 

So etwas wie das. Nicht getestet.

+0

Traceback (letzten Anruf zuletzt): Datei "new.py", Zeile 21, in Zeilen = sortiert (Zeilen, Schlüssel = Lambda line: get_date (line [3])) Datei "new.py", Zeile 21, in Zeilen = sortiert (Zeilen, Schlüssel = Lambdazeile: get_date (Zeile [3])) Datei "new.py" , Zeile 6, in get_date Rückgabe datetime.strptime ('% - m /% - d /% Y', Datum) Datei "H: \ Anaconda2 \ lib \ _strptime.py", Zeile 332, in _strptime (data_string , Format)) ValueError: Zeitdaten '% -m /% - d /% Y' stimmt nicht mit Format '4/3/2017' – Anthony

+0

Ich bekomme einen Fehler, weil die Monate unter 10 sollten 0 haben und sie don t. Kann die Funktion geändert werden, damit sie nicht danach aussieht? – Anthony

+0

Thyrst, ich habe mir deinen Code genauer angeschaut und ich denke nicht, dass das funktionieren wird, weil ich nach mehreren Zeilen suche, die nicht zurückgegeben werden müssen. Bedeutung Alles, was der Name und die ID-Felder zusammenpassen, möchte ich auf alle Daten ansehen und das Neueste abrufen. Das bedeutet, in meinem obigen Beispielcode sollten 4 Zeilen zurückgegeben werden. Anthony-1, Anthony-4, Bob-1 und Bob-4 – Anthony