Forum: PC-Programmierung Datum vergleichen in Python


von Thomas (Gast)


Lesenswert?

Hi,

ich habe ein festes Datum, jetzt möchte ich vergleichen ob das feste 
Datum in Vergangenheit ist oder in Zukunft.
1
date = "01.04.2016"
2
3
4
for j in date:
5
     if j <= time.strftime("%d.%m.%Y"):
6
            print ("j")
7
     if j >= time.strftime("%d.%m.%Y"):
8
            print ("n")

Das gibt mir das hier aus

j
n
j
j
n
j
n
j
n
n


Wie wäre das richtig?
von Lukas K. (carrotindustries)


Lesenswert?

Du machst aus deinem String ein datetime.date-Objekt: 
https://docs.python.org/3.5/library/datetime.html Das kannst du dann mit 
datetime.date.today() vergleichen.
von Kaj (Gast)


Lesenswert?

date ist bei dir ein String, und du gehst zeichen für zeichen durch.
Du willst aber eine Liste haben, und Element für Element durch gehen.
1
date = ["01.04.2016"]
2
3
for j in date:
4
    # do what ever
von Das glaube ich nicht, Tim! (Gast)


Lesenswert?

Er will mit Sicherheit keine Liste haben ...

Ansonsten noch so als Tip: Im Link von Lukas nach "strptime" suchen.
von Kaj (Gast)


Lesenswert?

Das glaube ich nicht, Tim! schrieb:
> Er will mit Sicherheit keine Liste haben ...
Ich denke schon, sonst macht seine for-Schleife naemlich keinen Sinn.
von Rolf M. (rmagnus)


Lesenswert?

Thomas schrieb:
> Hi,
>
> ich habe ein festes Datum, jetzt möchte ich vergleichen ob das feste
> Datum in Vergangenheit ist oder in Zukunft.
> date = "01.04.2016"

Na wenn das Datum fest ist, ist das doch ganz einfach: Der 01.04.2016 
ist in der Vergangenheit und wird es auch immer bleiben. Also ist eine 
Prüfung gar nicht notwendig. Oder was genau meinst du mit "festes 
Datum"?

> Das gibt mir das hier aus

Du prüfst jedes Zeichen deines Strings einzeln gegen den kompletten 
String mit dem aktuellen Datum. Generell kannst du mit einem 
Stringvergleich das Datum nicht vergleichen - zumindest nicht in diesem 
Format.

> Wie wäre das richtig?

So wie Thomas geschrieben hat.

Kaj schrieb:
> date ist bei dir ein String, und du gehst zeichen für zeichen durch.
> Du willst aber eine Liste haben, und Element für Element durch
> gehen.
>
> date = ["01.04.2016"]

Warum sollte er eine Liste aus einem Datum haben wollen?

Kaj schrieb:
> Das glaube ich nicht, Tim! schrieb:
>> Er will mit Sicherheit keine Liste haben ...
> Ich denke schon, sonst macht seine for-Schleife naemlich keinen Sinn.

Was aber genauso gut bedeuten kann, dass er eigentlich keine 
for-Schleife will.
von Anfänger (Gast)


Lesenswert?

date = "01.04.2016"


for j in date:
     if j <= time.strftime("%d.%m.%Y"):
            print ("j")
     if j >= time.strftime("%d.%m.%Y"):
            print ("n")

Falls das Datum der 01.04.2016 ist werden doch beide if-Schleifen 
erfüllt oder?

Da  "if j kleiner gleich..."
und "if j größer gleich..."
von Harald K. (carbonblack)


Lesenswert?

Da ich als ersten Treffer hier gelandet bin...
die Antwort von Lukas K. (carrotindustries) vom 05.04.2016 23:18 ist die 
sicherste Lösung.
Hier die Erklärung für das Verhalten des codes aus der Ursprungsfrage:
mit for j in date : wird erreicht, dass j mit jedem Durchlauf der 
Schleife ein Zeichen aus date ( von links nach rechts ) enthält.
1. Durchlauf j = "0" : "0" ist lexikalisch < "01" ( 01.04.2016 )
2. Durchlauf j = "1" : "1" ist lexikalisch > "01"
...

Man kann das mir einem String-Vergleich machen, muss aber dabei 
beachten, dass der Vergleich lexialisch also (intern Zeichen für 
Zeichen) von links nach rechts läuft. Das heißt, das 1. Zeichen ( links 
) hat das höchste „Gewicht“

Gewünscht ist sicher, dass das Jahr das größte Gewicht hat ( also nach 
links damit ) Will man nach Datum sortieren geht das, wenn die Daten im 
Format Jahr Monat Tag ( z.B: %Y.%m.%d ) vorliegen. ( Die Trennzeichen 
sind optional und frei wählbar - Hauptsache einheitlich )
von Marek N. (db1bmn)


Lesenswert?

Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet (sofern 
es sich nicht in der Bronzezeit befindet) und dann verglichen.
von Johannes F. (jofe)


Lesenswert?

Marek N. schrieb:
> Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet (sofern
> es sich nicht in der Bronzezeit befindet) und dann verglichen.

Wozu denn das? Zweckmäßigerweise macht man aus dem Datum einen 
ganzzahligen Wert (meist Unix-Zeit), mit dem sich dann sehr einfach 
rechnen (z.B. Differenz bilden) und vergleichen läßt.
von Alexander (alecxs)


Lesenswert?

Harald K. schrieb:
> Gewünscht ist sicher, dass das Jahr das größte Gewicht hat

Hat hier leider nicht geklappt.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Marek N. schrieb:
> Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet (sofern
> es sich nicht in der Bronzezeit befindet) und dann verglichen.

Das ist 'ne Threadleiche, und sie wurde nur ausgegraben um zu 
bestätigen, dass bereits die allererste Antwort im Thread die beste war. 
Da muss man jetzt nicht 10 Jahre danach (ohne neue Erkenntnisse) nochmal 
alles von vorn aufrühren und diskutieren, was sonst noch möglich wäre.
von Marek N. (db1bmn)


Lesenswert?

Johannes F. schrieb:
> Zweckmäßigerweise macht man aus dem Datum einen
> ganzzahligen Wert (meist Unix-Zeit)

Naja, das Julianische Datum hat den Vorteil, dass es eben nicht alle 
4,29 Milliarden Sekunden überläuft, sondern linear seit dem Jahr 4712 v. 
Chr. kontinuierlich weitergezählt wird, ohne irgendwelche 
Modulo-Operationen.
von Johannes F. (jofe)


Lesenswert?

Marek N. schrieb:
> Naja, das Julianische Datum hat den Vorteil, dass es eben nicht alle
> 4,29 Milliarden Sekunden überläuft,

Wir sind inzwischen im 64-bit-Zeitalter angekommen ...

Marek N. schrieb:
> sondern linear seit dem Jahr 4712 v.
> Chr. kontinuierlich weitergezählt wird, ohne irgendwelche
> Modulo-Operationen.

Unix-Zeit wird genauso linear weitergezählt, und bei Verwendung von 
vorzeichenbehafteter Arithmetik auch beliebig weit in die Steinzeit. Daß 
man keine komplizierten Rechnungen braucht, ist ja gerade der Sinn der 
Sekundenzählung.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stop!

Lest euch doch wenigstens den Thread durch. Wenn ihr wirklich denkt, 
dass Lukas' Vorschlag (erste Antwort überhaupt!) für die Frage 
ungeeignet ist, dann erklärt, warum ihr das so seht.
von Johannes F. (jofe)


Lesenswert?

Jörg W. schrieb:
> Wenn ihr wirklich denkt,
> dass Lukas' Vorschlag (erste Antwort überhaupt!) für die Frage
> ungeeignet ist,

Ist er natürlich nicht; im Gegenteil, das Umwandeln in ein Date-Objekt 
sollte wohl in sämtlichen "modernen" objekt-orientierten Sprachen bzw. 
unter Nutzung von deren Standardbibliotheken das einfache und 
zuverlässige Mittel der Wahl sein. Ganz im Gegensatz zu ...

Marek N. schrieb:
> Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet

... was m.E.n. völliger Unfug ist.
von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Selbst, wenn man keine Datums-Funktionen zur Verfügung hat :
Das Datum einfach nach YYYYMMDD in eine Zahl umwandeln.
Manche sagen auch Datenbankformat dazu.

Also hier  :
20160401 - für 01.04.2016
20260609 - für heute

und dann halt mit > oder < abfragen. Eignet sich auch gut, wenn man
mehrere Datums sortieren will. Danach halt wieder zurückwandeln.
In Python hat man ja auch einiges :
1
from datetime import datetime, timezone
2
api_format = datetime.now(timezone.utc).isoformat()
3
# Ausgabe: "2026-06-09T17:59:00.000+00:00"
Da kann man sich notfalls ja auch die ersten 10 Zeichen rausschneiden
und die Bindestriche entfernen.
: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.