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.

  • Sollte ich Cache-Bereich Ergebnisse, wenn ich sie wiederverwenden?
  • Verwenden der Warteschlange in Python
  • Wie man das ANSI CRC16 Polynom (0x8005) in python3 berechnet?
  • Unicode und Kodierung für persische oder arabische in python3
  • Wie man Zeilen in zwei Dateien vergleichen kann, sind gleich oder verschieden in Python
  • Wie fügst du eine Liste hinzu, um zu einer Zeile auf meinem Code zu springen?
  • Laufen Code durch einen Ordner von Dateien mit Pandas
  • Py3k Speichererhaltung durch Rückgabe von Iteratoren statt Listen
  • Python ist die beste Programmiersprache der Welt.