Seite 1 von 1

monthdelta

Verfasst: Samstag 6. Dezember 2008, 16:34
von cofi
Da ich gerade von einem Datum einen Monat zurückrechnen will (6.12. -> 6.11.) stehe ich vor einem Problem.

Code: Alles auswählen

In [58]: olddate = datetime.date(2008, 12, 6)

In [59]: newdate = datetime.date(olddate.year, olddate.month-1, olddate.day)

In [60]: newdate
Out[60]: datetime.date(2008, 11, 6)
Klappt zwar, aber ist nicht wirklich stabil.
Dann dachte ich ein Dictionary, das die Monate auf ihre jeweiligen Längen mappt und dann per datetime.timedelta das neue Datum errechnet, aber dann stehe ich vor dem Problem der Schaltjahre.

Gibt es da eine elegante Lösung und ich habe sie nur übersehn, oder muss ich tatsächlich auf die Dictionary Variante zurückfallen ?

Re: monthdelta

Verfasst: Samstag 6. Dezember 2008, 17:18
von numerix
cofi hat geschrieben:Da ich gerade von einem Datum einen Monat zurückrechnen will (6.12. -> 6.11.) stehe ich vor einem Problem.

Code: Alles auswählen

In [58]: olddate = datetime.date(2008, 12, 6)

In [59]: newdate = datetime.date(olddate.year, olddate.month-1, olddate.day)

In [60]: newdate
Out[60]: datetime.date(2008, 11, 6)
Klappt zwar, aber ist nicht wirklich stabil.
Dann dachte ich ein Dictionary, das die Monate auf ihre jeweiligen Längen mappt und dann per datetime.timedelta das neue Datum errechnet, aber dann stehe ich vor dem Problem der Schaltjahre.

Gibt es da eine elegante Lösung und ich habe sie nur übersehn, oder muss ich tatsächlich auf die Dictionary Variante zurückfallen ?
Nicht elegant, aber fast stabil ... :)

Code: Alles auswählen

In [8]: olddate = datetime.date(2008,1,6)

In [9]: newdate = datetime.date(olddate.year-(not bool(olddate.month-1)),olddate.month-1 or 12,olddate.day)

In [10]: newdate
Out[10]: datetime.date(2007, 12, 6)
An dem, was jetzt noch nicht funktioniert wird im Grunde aber die Problematik dessen deutlich, was du vorhast: Was bedeutet denn für dich "1 Monat zurückrechnen" z.B. am 31.03. ? Oder am 30.03.?

Verfasst: Samstag 6. Dezember 2008, 18:13
von cofi
Ich weiss schon was du meinst, aber ich hab hier ein Dateiformat, dass ich lesen muss.
Es hat 31 Zeilen mit Tageswerten und in der 32. Zeile das Datum der Erzeugung.

Jetzt ist es aber so, dass nur die Werte deren Tag (1. Zeile = 1. Tag, 31. Zeile = 31. Tag) vor dem Erzeugungsdatum liegt vom aktuellen Monat sind und die restlichen vom vorherigen. Hat ein Monat keine 31 Tage, dann sind das wohl die Werte vom vorletzten (:roll:)

Weil die Werte dann auch nicht stimmen, werde ich deine Lösung wohl benutzen, den ValueError abfangen, wenn der Tag nicht existiert, und den Rest der Werte in den Wind schiessen ;)
Vielen dank für das Snippet ;)

Wer dieses Format dämlich findet, dem stimme ich zu, aber ich muss nunmal damit arbeiten *sfz*