ValueError: Tag ist außerhalb des Bereichs für Monat datetime

Ich habe ein Problem mit einem Code, den ich geschrieben habe Ich nehme vier Eingaben (Tag, Monat und Jahr) als Datum und Zeiten, wie oft sie die Aufgabe wiederholen möchten (zB jeden Montag für 3 Wochen). Der Code ist großartig aber wenn die Wochen zwischen den Monaten unterscheiden, bekomme ich diesen Fehler:

File "C:\Users\dansi\AppData\Local\Programs\Python\Python36-32\gui test 3.py", line 72, in addtimeslot fulldateadd = datetime.date(year, month, day) ValueError: day is out of range for month 

Teil des Codes, der relevant ist:

 for i in range(0 , times): fulldateadd = datetime.date(year, month, day) cursor.execute( '''INSERT INTO dates (Date, Name, Start, End) VALUES( ?,?,?,? );''', (fulldateadd , name1, starttimehour, endtimehour)) day = day + 7 if day > 31: month = month + 1 

Ich habe versucht, den Monat zu erhöhen, wenn die Anzahl der Tage mehr als 31 ist, aber es scheint nicht zu funktionieren.

One Solution collect form web for “ValueError: Tag ist außerhalb des Bereichs für Monat datetime”

Es gibt mehrere Gründe, warum die Inkrementierung der Komponenten eines Datums und dann die Schaffung eines neuen ist nicht eine gute Idee. In erster Linie weil der Umgang mit dem gregorianischen Kalender selbst ist nicht so angenehme IMHO, und datetime Objekte können es für Sie tun.

In diesem Fall wäre ein viel einfacher Ansatz wäre, ein Timedelta zu Ihrem datetime innerhalb der Schleife hinzuzufügen. Zum Beispiel,

 >>> from datetime import timedelta >>> times = 4 >>> cur_date = datetime.date(2017, 2, 24) >>> for _ in range(times): print('today is {0}, do something'.format(cur_date)) cur_date += timedelta(days=7) today is 2017-02-24, do something today is 2017-03-03, do something today is 2017-03-10, do something today is 2017-03-17, do something 

Dies könnte auch in einem Generator platziert werden, je nach Anwendungsfall.

 >>> for dt in (cur_date + timedelta(days=x*7) for x in range(times)): print('today is {0}, do something'.format(dt)) today is 2017-02-24, do something today is 2017-03-03, do something today is 2017-03-10, do something today is 2017-03-17, do something 

Oder mit Pandas pd.date_range

 >>> import pandas as pd >>> list(pd.date_range(start='2017-02-24', periods=4, freq='7D')) [Timestamp('2017-02-24 00:00:00', freq='7D'), Timestamp('2017-03-03 00:00:00', freq='7D'), Timestamp('2017-03-10 00:00:00', freq='7D'), Timestamp('2017-03-17 00:00:00', freq='7D')] 

Nun, was würde passieren, wenn Sie dieses Beispiel mit Ihrem Ansatz versucht haben?

 >>> year, month, day = 2017, 2, 24 >>> for i in range(0 , times): day = day fulldateadd = datetime.date(year, month, day) print('today is {0}, do something'.format(fulldateadd)) day = day + 7 if day > 31: day = day - 31 month = month + 1 today is 2017-02-24, do something ValueErrorTraceback (most recent call last) <ipython-input-255-7df608ebbf8e> in <module>() 1 for i in range(0 , times): 2 day = day ----> 3 fulldateadd = datetime.date(year, month, day) 4 print('today is {0}, do something'.format(fulldateadd)) 5 day = day + 7 ValueError: day is out of range for month 

Februar hat nicht 31 Tage … so müssten Sie einen Scheck mit einer Mapping auf die Anzahl der Tage in jedem Monat enthalten. Inklusive Logik für Schaltjahre.

  • QPX Express API von Python
  • Exe erstellt mit cx_freeze funktioniert nicht richtig
  • Python 3.5 32-Bit-Fenster-Import-Modul scheitert, aber Pip-Installation funktioniert
  • Warum ist Ertrag für den Pythongenerator erforderlich?
  • Kann python parallele schreiben eine datei ohne mit lock oder mutex?
  • Es konnte keine Liste von Elementen in eine Datei mit Python geschrieben werden
  • Mit Schildkrötenmodul exitonclick ()
  • Schwierigkeit, die Einzelteilzählung für die Kombinationen der Liste der Einzelteile vom Pythonwörterbuch zu erhalten
  • Pygal Karten Welt funktioniert nicht
  • Welche Technologien gibt es, um eigenständige ausführbare Dateien für Python 3 zu erstellen?
  • Mit pickle.dumps zu Hash-mutable Objekte
  • Python ist die beste Programmiersprache der Welt.