2016-06-14 10 views
2

Was ich versuche zu tun:Valueerror: Zeitdaten '' nicht mit Format '% d-% m-% Y% H:% M:% S'

  1. Delete all rows where csv date is lower than 25.05.2016 23:59
  2. Save the file with a different name

Ich habe die folgende in Daten in einer cSV-col A

WFQVG98765 
FI Quality-Value-Growth 
Some Random String 1 

Datum 
13-05-2016 23:59 
14-05-2016 23:59 
15-05-2016 23:59 
16-05-2016 23:59 
17-05-2016 23:59 
18-05-2016 23:59 
19-05-2016 02:03 
. 

. 

. 

. 

Dies ist, was ich jetzt versucht haben

import csv 
import datetime 
from dateutil.parser import parse 

def is_date(string): 
    try: 
     parse(string) 
     return True 
    except ValueError: 
     return False 

''' 
1. Delete all rows where csv date is lower than 25.05.2016 23:59 
2. Save the file with a different name 
''' 

cmpDate = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S') 

with open('WF.csv', 'r') as csvfile: 
    csvReader = csv.reader(csvfile, delimiter=',') 
    for row in csvReader: 
     print (row[0]) 
     if is_date(row[0]) and not row[0].strip(' '): 
  csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') 'Error Here : ValueError: time data '' does not match format '%d-%m-%Y %H:%M:%S' 

Ich habe auch versucht, dies für die Fehlerzeile

  csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M')  'But got the same error 
   if csvDate<cmpDate: 
       print (row[0]+'TRUE') 

Here how can I delete the row if the condition is true and finally save it with a different name ?

Antwort

2

Sie können jede Zeile analysieren, um die Daten zu vergleichen, und die Zeilen speichern, die Sie in einer list behalten möchten. Sie können diese Zeilen dann in einer neuen CSV-Datei speichern und die alte löschen, wenn Sie sie nicht mehr benötigen.

Hier ist ein snipped das tut, was Sie für Fragen:

import csv 
from datetime import datetime 

cmpDate = datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S') 


def is_lower(date_str): 
    try: 
     csvDate = datetime.strptime(row[0], '%d-%m-%Y %H:%M') 
     return (csvDate < cmpDate) 
    except: 
     pass 

with open('WF.csv', 'r') as csvfile: 
    csvReader = csv.reader(csvfile, delimiter=',') 
    data = [row for row in csvReader if not is_lower(row[0])] 

with open('output.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',') 
    [writer.writerow(row) for row in data] 
+0

Danke, aber ich weiß nicht, warum es eine leere Zeile zwischen den beiden Zeilen und das funktioniert nicht wirklich, dh in der output.csv-Datei habe ich alle Zeilen aus der Eingabedatei:/ – newguy

+0

@newguy verwendet Ihre Eingabe csv ',' als Trennzeichen? Hat es ein Datum in der ersten Reihe? Kannst du die ersten paar Zeilen aus deiner CSV-Datei mit einem Header versehen? – kardaj

+0

Die Frage hat den genauen Text, was in der CSV-Spalte A und ja ',' ist das Trennzeichen für meine CSV – newguy

2

is_date() wird Ihnen Fehlalarme geben. Seien Sie strenger beim Überprüfen des Datumsformats und konsistent, wenn Sie eine Datumszeichenkette in datetime laden - folgen Sie einem der Prinzipien von Zen of Python - "Es sollte eine sein - und vorzugsweise nur eine - offensichtliche Art und Weise, es zu tun":

def is_date(date_string): 
    try: 
     datetime.datetime.strptime(date_string, '%d-%m-%Y %H:%M:%S') 
     return True 
    except ValueError: 
     return False 

Mit anderen Worten, mischen Sie nicht dateutil.parser.parse() und datetime.datetime.strptime().

2

Die Ausnahme datetime.datetime.strptime zeigt an, dass Sie eine leere Zeichenfolge an die Funktion in row[0] übergeben.

Sobald Sie dieses Problem gelöst haben, müssen Sie Code hinzufügen, um akzeptable Zeilen in eine neue Datei zu schreiben.

+0

Ja, ich weiß, dass der Fehler vielleicht aber soll diese Zeile nicht 'wenn is_date (row [0]) und nicht row [0] .strip (‘ ‚):' Sorgfalt davon? d. h., wenn die Zeile Leerzeichen hat, wird sie nicht ausgeführt. – newguy

+0

Das 'nicht' macht das Gegenteil von dem, was Sie wollen. –

+0

Ohh mein schlechtes gerade fing an, Python zu lernen Danke :) – newguy

2

Sie den falschen Vergleich tun, wenn Sie strip nennen. Zwei Dinge:

  • Zunächst einmal einfach row[0].strip() (ohne Argumente) verwenden. Dies wird alle Leerzeichen (wie Zeilenumbrüche, etc), nicht nur Leerzeichen.
  • Zweitens wird if is_date(row[0]) and not row[0].strip(' ') nur übergeben, wenn row[0] leer ist, was das Gegenteil von dem ist, was Sie wollen. Dies sollte if row[0].strip() and is_date(row[0]):

Noch besser ist, wenn man bedenkt, wie Sie Ihre is_date Funktion implementiert ist, sollten Sie wahrscheinlich nur eine Funktion setzen Sie Ihre Datetime-Erstellung in die Fehler verarbeitet. Dies ist mein übliches Muster:

def parse_date(str_date): 
    try: 
     return datetime.datetime.strptime(str_date, '%d-%m-%Y %H:%M') 
    except ValueError: 
     return None 

cmp_date = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S') 

output_rows = [] 
with open('WF.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    for row in reader: 
     csv_date = parse_date(row[0].strip()) # returns a datetime or None 
     if csv_date and csv_date >= cmp_date: 
      output_rows.append(row) 

# Finally, write output_rows to the output file 
Verwandte Themen