monthdelta

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

monthdelta

Beitragvon cofi » Samstag 6. Dezember 2008, 16:34

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 ?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Re: monthdelta

Beitragvon numerix » Samstag 6. Dezember 2008, 17:18

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.?
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Samstag 6. Dezember 2008, 18:13

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*

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder