Wie vergleiche ich zwei Daten?

381

Wie würde ich mit Python zwei Daten vergleichen, um zu sehen, welche später sind?

Ich möchte beispielsweise überprüfen, ob das aktuelle Datum nach dem letzten Datum in dieser von mir erstellten Liste der Feiertagsdaten liegt, damit automatisch eine E-Mail gesendet wird, in der der Administrator aufgefordert wird, die Datei travel.txt zu aktualisieren.

Cecil Rodriguez
quelle
20
Ähm, Sie verwenden die Operatoren <und >, genau wie bei jedem anderen Vergleich.
Daniel Roseman
12
@ JohnMachin: Sie schreiben eine Funktion mit Prototyp int compare_dates(void const *, void const*), wandeln beide Argumente in struct Date *die Vergleichslogik um und implementieren sie. Für einen Python-Neuling ist dies möglicherweise nicht so offensichtlich.
Fred Foo
1
@larsmans: Sorry .... s / any_language / any_reasonable_language / und jeder, der an eine unvernünftige Sprache gewöhnt ist, sollte ein paar Minuten damit verbringen, die Dokumente zu lesen und date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects Strg-F Suche nach "Unterstützte Operationen"
John Machin
1
@Galaxy - er verwendet eine Analogie, um zu zeigen, dass das, was für einen erfahrenen Menschen einfach sein sollte, für einen Anfänger möglicherweise nicht einfach ist, und er verwendet C, um dies zu veranschaulichen. Er glaubt nicht, dass es sich bei der Frage um C handelt. Und er hatte Recht, ich war ein absoluter Anfänger, als ich diese Frage vor fast 8 Jahren stellte, und hatte keine Ahnung, wie irgendetwas davon funktionierte.
Cecil Rodriguez

Antworten:

495

Verwenden Sie die datetimeMethode und den Operator <und seine Verwandten.

>>> from datetime import datetime, timedelta
>>> past = datetime.now() - timedelta(days=1)
>>> present = datetime.now()
>>> past < present
True
>>> datetime(3000, 1, 1) < present
False
>>> present - datetime(2000, 4, 4)
datetime.timedelta(4242, 75703, 762105)
Fred Foo
quelle
19
Dies funktioniert auch für zeitzonenbewusste Werte, wenn sich jemand wundert.
Mat Gessel
2
Was ist anders zwischen pastund present? Ich kann Ihr Beispiel nicht verstehen und sein Ergebnis macht keinen Sinn.
Emadpres
19
@Emadpres: Stellen Sie sich vor, dies wurde manuell eingegeben. Die letzte Zeile wurde zuerst eingegeben, während die aktuelle Zeile als zweite eingegeben wurde ... also wurde die letzte Zeile zuerst eingegeben, sodass Vergangenheit <Gegenwart wahr ist.
Ramcdougal
2
Zitat aus dem Dokument: "Wenn ein Vergleich naiv ist und der andere bekannt ist, wird TypeError ausgelöst, wenn ein Ordnungsvergleich versucht wird. Bei Gleichheitsvergleichen sind naive Instanzen niemals gleich bewussten Instanzen. Wenn beide Vergleiche bekannt sind und dasselbe haben tzinfo-Attribut, das gemeinsame tzinfo-Attribut wird ignoriert und die Basisdatenzeiten werden verglichen. Wenn beide Vergleichsdaten bekannt sind und unterschiedliche tzinfo-Attribute haben, werden die Vergleichswerte zuerst durch Subtrahieren ihrer UTC-Offsets angepasst (erhalten von self.utcoffset ()). "
Vikas Prasad
2
Die Variablennamen sollten pastund sein past_but_a_little_after. Technisch presentist auch in der Vergangenheit, wenn der Vergleich past < presentgemacht wird.
Grisaitis
75

Verwenden time

Angenommen, Sie haben die Anfangsdaten als Zeichenfolgen wie diese:
date1 = "31/12/2015"
date2 = "01/01/2016"

Sie können Folgendes tun:
newdate1 = time.strptime(date1, "%d/%m/%Y")und newdate2 = time.strptime(date2, "%d/%m/%Y")sie in das Datumsformat von Python konvertieren. Dann ist der Vergleich offensichtlich:

newdate1 > newdate2wird zurückkehren False
newdate1 < newdate2wird zurückkehrenTrue

Guillermo Pereira
quelle
40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)wird zurückkehren True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)wird zurückkehren datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)wird zurückkehren datetime.timedelta(1).

Siehe die Dokumente .

Daniel Nill
quelle
3

Andere Antworten datetimeund Vergleiche funktionieren auch nur für die Zeit ohne Datum.

Um beispielsweise zu überprüfen, ob es jetzt mehr oder weniger als 8:00 Uhr ist, können wir Folgendes verwenden:

import datetime

eight_am = datetime.time( 8,0,0 ) # Time, without a date

Und später vergleichen mit:

datetime.datetime.now().time() > eight_am  

welches zurückkehren wird True

Luis
quelle
-1

Die Berechnung der Tage in zwei Datumsunterschieden kann wie folgt erfolgen:

import datetime
import math

issuedate = datetime(2019,5,9)   #calculate the issue datetime
current_date = datetime.datetime.now() #calculate the current datetime
diff_date = current_date - issuedate #//calculate the date difference with time also
amount = fine  #you want change

if diff_date.total_seconds() > 0.0:   #its matching your condition
    days = math.ceil(diff_date.total_seconds()/86400)  #calculate days (in 
    one day 86400 seconds)
    deductable_amount = round(amount,2)*days #calclulated fine for all days

Denn wenn eine Sekunde mehr mit dem Fälligkeitsdatum ist, müssen wir berechnen

Pallavi Sharma
quelle
Beantwortet die Frage nicht.
Willwsharp