2017-12-29 2 views
1

Ich bin fast fertig mit einer Datumsberichtigungsfunktion (mein erstes reales Projekt in Python!) Und ich habe eine Menge großartige Hilfe durch stackoverflow bekommen - danke!Python: Test, ob die Zeichenfolge einem Datetime-Objekt entspricht?

Mein Problem ist jetzt für eine Variable zu testen, die nicht den Bedingungen entspricht, die ich in meinem Programm angegeben habe. Hier ist, was ich versuche zu tun:

Für Termine in meinem Programm, ich möchte gegen verschiedene Möglichkeiten, wie diese Daten möglicherweise eingegeben wurden (z. B. 01/01/1999, 01-01-1999, 01-Jan -1999, 1/1/1999, 3-9-1999, "Keine" usw.). Was ich nicht zur Arbeit bringen kann, ist, wenn ein Wert eingegeben wurde, der a) keine Ganzzahl (d. H. 1999), b) nicht im Format datetime.date oder c) nicht die Zeichenkette 'None' ist. In meinem Beispiel des vollständigen Codes unten kann ich nicht herausfinden, wie man "WÖRTER" bekommt, um eine Ausnahme zu treffen, die etwas besagt, dass es kein gültiges Datum ist.

Wenn jemand Zeit hat, können Sie bitte meinen Code ansehen und sehen, ob Sie einen offensichtlichen Fehler bemerken? Ich denke, ich brauche vielleicht etwas, das die Variable "Datum" vergleicht, ob es ein Datetime-Objekt ist oder nicht, und wenn es falsch ist, eine Nachricht ausgeben, die anzeigt, dass es kein gültiges Datum ist, aber mehrere Versuche, dies zu erfassen erfolglos. Wenn jemand einen Vorschlag oder einen anderen Artikel zu lesen hat oder wenn er eine ähnliche Frage finden kann (ich habe keine gefunden), lass es mich wissen. Vielen Dank für Ihre Zeit!

* Auch, wenn die Codierung zu ausführlich ist, bitte vergib mir; erster Timer!

import datetime 
import sys 
import re 

debug = True 
log = sys.stdout 

dates = ["WORDS", "4-1-2010", "9/1/1999", "7-9-2000", "01/01/2001", "None", "14-Jun-1905", \ 
"09/09/2009", 2008, "06-06-2006", 1999, "05-May-2005", "12/31/2010", "09-Jul-1905", "07/09/1905", \ 
"07-09-1905", "1-Jul-1905", "03-Aug-1935", "3/1/1965", 1900] 

def fix_date(date): 
    constant = datetime.date(1899, 12, 30) 
    if debug : print("Fix date:", date, file=log) 
    dt = datetime.datetime.strptime(date, '%d-%b-%Y') 
    year = int(dt.year) 
    month = int(dt.month) 
    day = int(dt.day) 
    cleanDate = datetime.date(year, month, day) 
    dateYear = cleanDate - constant 
    x = int(dateYear.days) 
    if x < 1901: 
     print("ERROR: Date removed:", date, '\n', file=log) 
     return "" 
    elif x <= datetime.datetime.now().year: 
     print("Date converted:", date, "\b:", dateYear.days, file=log) 
     print("Date OK:", dateYear.days, '\n') 
     return str(dateYear.days) 
    else: 
     newdate = datetime.datetime.strftime(cleanDate, '%Y%m%d') 
     if debug : print("Date OK:", newdate, '\n', file=log) 
     return newdate 
    print() 

print('\nAll Date Variables:\n') 
count = 0 

for date in dates: 
    count += 1 
    print(count, '\b: Original date:', date) 
    try: 
     if date != datetime.datetime.strptime(date, '%m-%d-%Y'): 
      dt = datetime.datetime.strptime(date, '%m-%d-%Y') 
      date = datetime.datetime.strptime(date, '%m-%d-%Y').strftime('%d-%b-%Y') 
      print("DASH:", date) 
      fix_date(date) 
    except: 
     try: 
      if date != datetime.datetime.strptime(date, '%m/%d/%Y'): 
       dt = datetime.datetime.strptime(date, '%m/%d/%Y') 
       date = datetime.datetime.strptime(date, '%m/%d/%Y').strftime('%d-%b-%Y') 
       print("SLASH:", date) 
       fix_date(date) 
     except: 
      try: 
       if date != datetime.datetime.strptime(date, '%d-%b-%Y'): 
        dt = datetime.datetime.strptime(date, '%d-%b-%Y') 
        date = datetime.datetime.strptime(date, '%d-%b-%Y').strftime('%d-%b-%Y') 
        print("MEDIUM:", date) 
        fix_date(date) 
      except: 
       try: 
        if date.strip() == "None": 
         print("NONE:", date) 
         print("DO NOT ENTER A DATE\n") 
       except: 
        try: 
         if len(str(date)) == 4: 
          print("INTEGER:", date) 
          print("Date OK:", str(date), '\n') 
        except: 
         print("SOME ERROR OCCURRED") 

EDIT

bekam ich die Dinge durch Änderung des Code leicht zu arbeiten und in dem Block vor dem letzten Try/außer Block eine "else" Aussage. Einfacher zu sehen, meine Bearbeitung durch die Spur der Sterne zu suchen :)

... 
       try: 
        if date.strip() == "None": 
         print("NONE:", date) 
         print("DO NOT ENTER A DATE\n") 
        else: 
         print("********************INVALID DATE") 
... 

Antwort

1

Ich fand etwas ein bisschen besser. Anstatt alle Formate selbst auszuprobieren, verwenden Sie das Dateutil. Eine Codezeile zum Testen und Analysieren des Datums.

Sie finden das dateutil pip Paket

import dateutil 
from dateutil import parser 

dte = dateutil.parser.parse('03-31-1981'); 
dte = dateutil.parser.parse('03/31/1981'); 
dte = dateutil.parser.parse('1981-03-31'); 
dte = dateutil.parser.parse('1981-MAR-31'); 
print(dte) 
+0

Danke brauchen! Ich schaue durch dateutil; Wird dies auch dazu beitragen, variable Daten zu identifizieren, die nicht in einem bestimmten Format vorliegen, oder würde das jetzt einfach mit einer einfachen if/else-Anweisung gehandhabt? Danke für Ihre Hilfe! –

+0

Nach Ihrem früheren Vorschlag mit der else-Anweisung ging ich zurück. Es scheint, dass es funktioniert, wenn ich es in die vorletzte try/if-Anweisung setze ... komisch. Irgendeine Idee warum? ' ... wenn date.strip() == "None" code': print ("NONE", Datum) print ("ENTER kein Datum \ n") anderes: Druck ("UNGÜLTIGES DATUM \ n") ... 'code' –

+0

Um kurz mit dateutil herumzukommen, könnte es eine Welt von neuen Formaten geben, mit denen es arbeiten könnte. Wird definitiv damit spielen. Vielen Dank! –

Verwandte Themen