2017-12-29 59 views
0

In meinem Python 3.6-Anwendung, von meiner Eingangsdaten kann ich datatimes in zwei verschiedenen Formaten erhalten:Was ist eine effiziente Möglichkeit, eine Zeichenfolge für ein bestimmtes Datetime-Format wie "m%/d%/Y%" in Python 3.6 zu testen?

"datefield":"12/29/2017" oder "datefield":"2017-12-31"

ich die sicherstellen müssen, dass ich entweder Datetime-Format verarbeiten kann und wandeln sie in (oder lasse es im iso 8601-Format. Ich möchte so etwas wie dies zu tun:

#python pseudocode 
import datetime 
if datefield = "m%/d%/Y%": 
    final_date = datetime.datetime.strptime(datefield, "%Y-%m-%d").strftime("%Y-%m-%d") 
elif datefield = "%Y-%m-%d": 
    final_date = datefield 

Das Problem ist, ich weiß nicht, wie die Datefield für ein bestimmtes Datums-Zeitformat in meinem Pseudo-Code in dieser ersten if-Anweisung zu überprüfen. Ich will einen wahren oder falschen Rücken. Ich lese die Python-Dokumente und einige Tutorials durch. Ich habe ein oder zwei obskure Beispiele gesehen, die try-except-Blöcke verwendet haben, aber das scheint kein effizienter Weg zu sein, damit umzugehen. Diese Frage ist einzigartig bei anderen Stack-Überlauf-Posts, da ich zwei verschiedene Fälle behandeln und validieren muss, nicht nur einen Fall, bei dem ich einfach fehlschlagen kann, wenn es validiert.

+4

_ "ich durch die Python-Dokumentation zu lesen und einige Tutorials Ich habe ein oder zwei obskuren Beispiele sehen, die try-except Blöcke verwendet, aber das scheint nicht wie ein effizienter Weg, um damit umzugehen. "_ - Tatsächlich wird die Verwendung von Ausnahmen in Python als idiomatisch betrachtet und ist in vielen Fällen oft schneller als ein" if/else "-Block. Nur zu deiner Information. –

+0

Mögliches Duplikat von [Wie validiere ich ein Datumstringformat in Python?] (Https://stackoverflow.com/questions/16870663/how-do-i-validate-a-date-string-format-in-python) –

+0

@PatrickHaugh Ich lese diese Frage, aber ich dachte, es ist nicht Äpfel zu Äpfeln, denn in meinem Fall habe ich zwei Datumsformate, die keine Fehler oder Ausnahmefälle sind. Sie sind zwei häufige Anwendungsfälle, die behandelt und geroutet werden müssen. –

Antwort

0

ich mit dem Rat von @ChristianDean ging und verwendet, um die try-except Block in der Bemühung, Pythonic zu sein. Das erste Format% m /% d /% Y erscheint ein bisschen mehr in meinen Daten, also führe ich die try-exception mit diesem Formatierungsversuch für datetime.

Hier ist meine endgültige Lösung.

import datetime 
try: 
    final_date = datetime.datetime.strptime(datefield, "%m/%d/%Y").strftime("%Y-%m-%d") 
except ValueError: 
    final_date = datetime.datetime.strptime(datefield, "%Y-%m-%d").strftime("%Y-%m-%d") 
1

Sie können die erste Art von Datum durch einen einfachen Stringtest erkennen, der nach den Trennzeichen / sucht. Je nachdem, wie „loose“ Sie wollen, dass der Scheck zu sein, können Sie einen bestimmten Index überprüfen oder die gesamte Zeichenfolge mit einem Teil Test scannen den in Operator:

if "/" in datefield: # or "if datefield[2] = '/'", or maybe "if datefield[-5] = '/'" 
    final_date = datetime.datetime.strptime(datefield, "%m/%d/%Y").strftime("%Y-%m-%d") 
+0

Die Suche nach einzelnen Zeichen könnte funktionieren, aber hat die Datetime-Bibliothek von Python eine Funktion, die ich verwenden könnte, um das Format zu testen, für den Fall, dass ich in Zukunft mit einem alternativen Datetime-Format konfrontiert werde? –

+0

Ich denke nicht, außer den Parsing-Funktionen. Das ist jedoch eine ziemlich vernünftige Option: Versuche es einfach zu parsen und wenn es funktioniert, hast du die Eingabe validiert. Wenn nicht, fangen Sie die Ausnahme ab und versuchen Sie etwas anderes. – Blckknght

1

Da Sie immer nur würden mit zwei Daten beschäftigen Formate, nur nach einem / oder einem - Zeichen überprüfen.

import datetime 

# M/D/Y 
if '/' in datefield: 
    final_date = datetime.datetime.strpdate(date, '%M/%D/%Y').isoformat() 

# Y-M-D 
elif '-' in datefield: 
    final_date = datetime.datetime.strpdate(date, '%Y-%M-%D').isoformat() 
0

Ein möglicher Ansatz ist die Verwendung der dateutil-Bibliothek. Es enthält viele der gängigsten Datetime-Formate und kann diese Formate automatisch für Sie erkennen.

>>> from dateutil.parser import parse 

>>> d1 = "12/29/2017" 
>>> d2 = "2017-12-31" 
>>> parse(d1) 
datetime.datetime(2017, 12, 29, 0, 0) 

>>> parse(d2) 
datetime.datetime(2017, 12, 31, 0, 0) 

HINWEIS: dateutil ist eine 3rd-Party-Bibliothek, so dass Sie es mit etwas wie installieren können müssen:

pip install python-dateutil 

Es kann auf pypi finden: https://pypi.python.org/pypi/python-dateutil/2.6.1

und Werke mit Python2 und Python3.

Alternative Beispiele:

Hier sind ein paar alternative Beispiele dafür, wie gut dateutil Griffe zufällig Datumsformate:

>>> d3 = "December 28th, 2017" 
>>> parse(d3) 
datetime.datetime(2017, 12, 28, 0, 0) 

>>> d4 = "27th Dec, 2017" 
>>> parse(d4) 
datetime.datetime(2017, 12, 27, 0, 0) 
+0

Das würde auch funktionieren, aber ich möchte 3rd-Party-Bibliotheken vorerst vermeiden. Wenn die Dinge komplexer werden, gehe ich vielleicht den Weg. –

Verwandte Themen