Datumsberechnung

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.
reneschmidt
User
Beiträge: 20
Registriert: Montag 4. Januar 2016, 15:14

Datumsberechnung

Beitragvon reneschmidt » Freitag 16. März 2018, 23:14

Hallo zusammen,

irgendwie kommt ich an folgendem Punkt nicht weiter:
Ich habe ein Datum (z.B. 15.06.2018) und davon muss ich jetzt z.B. 36 oder 40 Monate zurück gehen.
Hat jemand einen Vorschlag, wie man das am einfachsten in Python realisieren kann?

Vielen Dank im Voraus.
Benutzeravatar
__deets__
User
Beiträge: 2495
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Datumsberechnung

Beitragvon __deets__ » Freitag 16. März 2018, 23:42

Mit dem datetime Modul und seinen Klassen wie zB timedelta,das so etwas kann.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Re: Datumsberechnung

Beitragvon sebastian0202 » Montag 19. März 2018, 10:07

Hallo,


ich würde obige Aufgabe so erledigen:
Die Lösung fühlt sich aber nicht gut an.
Darf man Funktionen in Funktionen definieren?

  1. from datetime import datetime, timedelta
  2. from itertools import count
  3.  
  4. def subtract_month(date, months=1):
  5.     def february(year):
  6.         return 29 if year%4==0 and not year%400==0 else 28
  7.        
  8.     def days_per_month(date):
  9.         return {"1":31, "2":february(date.year), "3":31, "4":30, "5":31,
  10.                 "6":30, "7":31, "8":31, "9":30, "10":31, "11":30, "12":31}
  11.  
  12.     for i in count(1):
  13.         if i > months:
  14.             break
  15.         period = days_per_month(date)[str(date.month)]
  16.         date = date - timedelta(days=period)
  17.     return date
  18.  
  19.  
  20. if __name__ == '__main__':
  21.     date = datetime(2020,3,29,6,30)
  22.  
  23.     for i in range(1,13):
  24.         print subtract_month(date, i)
  25. '''
  26. 2020-02-27 06:30:00
  27. 2020-01-29 06:30:00
  28. 2019-12-29 06:30:00
  29. 2019-11-28 06:30:00
  30. 2019-10-29 06:30:00
  31. 2019-09-28 06:30:00
  32. 2019-08-29 06:30:00
  33. 2019-07-29 06:30:00
  34. 2019-06-28 06:30:00
  35. 2019-05-29 06:30:00
  36. 2019-04-28 06:30:00
  37. 2019-03-29 06:30:00
  38. '''
Sirius3
User
Beiträge: 7460
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Datumsberechnung

Beitragvon Sirius3 » Montag 19. März 2018, 11:10

@sebastian0202: Deine Schaltjahrberechnung ist falsch. Ansonsten gibt es das alles schon im calendar-Modul. Ein `count` mit einem break, falls der Wert größer als eine bestimmte Grenze wird, ist eigentlich ein `range`. Warum benutzt Du für die Monatsnummer einen String? Wäre es nicht einfacher, Monat und Jahr separat auszurechnen und den Tag aus dem ursprünglichen Datum zu nehmen?

  1. >>> import datetime
  2. >>> date = datetime.datetime.now()
  3. >>> y, m = divmod(date.year*12+date.month - 21, 12)
  4. >>> date.replace(year=y, month=m)
  5. datetime.datetime(2016, 6, 19, 11, 11, 48, 413895)
narpfel
User
Beiträge: 168
Registriert: Freitag 20. Oktober 2017, 16:10

Re: Datumsberechnung

Beitragvon narpfel » Montag 19. März 2018, 16:08

@Sirius3: Man kann den Tag nicht aus dem ursprünglichen Datum nehmen, weil nicht alle Tage in allen Monaten existieren:
  1. In [18]: date = datetime.datetime(2018, 3, 31)
  2.  
  3. In [19]: date.replace(month=2)
  4. ---------------------------------------------------------------------------
  5. ValueError                                Traceback (most recent call last)
  6. <ipython-input-19-6ef8040186bb> in <module>()
  7. ----> 1 date.replace(month=2)
  8.  
  9. ValueError: day is out of range for month


@reneschmidt: Ob man jetzt mit `replace` die Jahre und Monate ändert oder `timedelta`s (bzw. Tage) aufsummiert, hängt so ein bisschen davon ab, was „ein Monat“ für dich ist. Was ist ein Monat vor dem 29. März? Der 28./29. Februar? 31 Tage früher? Vier Wochen früher? Was ist mit Sommer- und Winterzeit? Schaltsekunden? Diese Fragen müsstest du (für dich) beantworten.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Re: Datumsberechnung

Beitragvon sebastian0202 » Dienstag 20. März 2018, 09:47

Ja, die Schaltjahrberechnung ist falsch. Habe die Sache mit den 100 Jahren unter den Tisch fallen lassen.
Hab jetzt mit 'Calendar' einen kürzeren Code. Der wird aber für viele Durchläufe sicher uneffizient sein.

  1. from calendar import monthrange
  2. from datetime import datetime, timedelta
  3. ...
  4. def schaltjahr(jahr):
  5.     return 28 if jahr%100==0 and not jahr%400==0 else (29 if jahr%4==0 else 28)
  6. ...
  7. def subtract_month(date, months=1):
  8.     for _ in range(months):
  9.         date -= timedelta (days=monthrange(date.year,date.month)[1])
  10.     return date
  11.  
  12. if __name__ == '__main__':
  13.     date = datetime(2018,03,31)
  14.     print subtract_month(date, 37)
  15. '''
  16. 2015-02-28 00:00:00
  17. '''
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Datumsberechnung

Beitragvon snafu » Dienstag 20. März 2018, 19:56

Es gibt schon calendar.isleap() zur Ermittlung eines Schaltjahrs...
shcol (Repo | Doc | PyPi)

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]