Ich verwende das datetime Python-Modul. Ich möchte das Datum 6 Monate nach dem aktuellen Datum berechnen. Könnte mir jemand dabei helfen?
Der Grund, warum ich ein Datum 6 Monate nach dem aktuellen Datum generieren möchte, ist das Erstellen eines Überprüfungsdatums . Wenn der Benutzer Daten in das System eingibt, hat er ein Überprüfungsdatum von 6 Monaten ab dem Datum, an dem er die Daten eingegeben hat.
6
sie hinzu, mit Unterstützung für das Überlaufen des Jahres (und das Zurückfahren des Monats zurück1
), wenn wir über den Dezember hinausgehen. Dies ist genau dasrelativedelta
, was jede Programmiersprache mit Unterstützung für diese Art von Konzept tut und tatsächlich tut.date(2015, 3, 31) + relativedelta(months = 6)
gibtdatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
gibt2000-10-01T00:00:00
. Php:date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
gibt 2000-10-01. Wähle dein Gift.Antworten:
Ich fand diese Lösung gut. (Dies verwendet die Python-Dateutil-Erweiterung )
Der Vorteil dieses Ansatzes besteht darin, dass Probleme mit 28, 30, 31 Tagen usw. behoben werden. Dies ist sehr nützlich bei der Behandlung von Geschäftsregeln und -szenarien (z. B. Rechnungserstellung usw.).
quelle
relativedelta
Funktion auchmonth
als Argument verwendet wird, das im Grunde den Monat im übergebenen Datum ersetzt / setzt / korrigiert, was sich stark vom Hinzufügen weiterer Monate unterscheidet. Nur eine Warnung für Leute, die sich fragen, ob die Funktion unterbrochen ist, weil sie die zusätzlichen s in Monaten vergessen haben .datetime
standardmäßig mit verpackt zu sein . Ich nahm tatsächlich an, dass ich "Monate" in das Zeitdelta übergehen könnte.Nun, das hängt davon ab, was Sie mit 6 Monaten ab dem aktuellen Datum meinen.
Mit natürlichen Monaten:
Nach der Definition eines Bankiers 6 * 30:
quelle
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
kann, da sie ungültige Daten wie(31, 8, 2015)
->(31, 2, 2016)
Mit Python 3.x können Sie dies folgendermaßen tun:
Sie müssen jedoch das Python-Dateutil- Modul installieren :
quelle
pip install ...
from dateutil.relativedelta import relativedelta
. Die Verwendungimport *
ist nicht explizit.Für die Berechnung von Monat zu Monat:
quelle
Was meinst du mit "6 Monate"?
Ist 2009-02-13 + 6 Monate == 2009-08-13? Oder ist es 2009-02-13 + 6 * 30 Tage?
Weitere Infos zu mx.DateTime
quelle
Hier ist ein Beispiel für das,
dateutil.relativedelta
was ich nützlich fand, um das vergangene Jahr zu durchlaufen und jedes Mal einen Monat bis zum aktuellen Datum zu überspringen:Wie bei den anderen Antworten müssen Sie herausfinden, was Sie unter "in 6 Monaten" verstehen. Wenn Sie "den heutigen Tag des Monats im Monat sechs Jahre in der Zukunft" meinen, dann würde dies Folgendes bewirken:
quelle
Diese Lösung funktioniert im Dezember ordnungsgemäß, was bei den meisten Antworten auf dieser Seite nicht der Fall ist. Sie müssen zuerst die Monate von Basis 1 (dh Jan = 1) auf Basis 0 (dh Jan = 0) verschieben, bevor Sie den Modul (%) oder die Ganzzahldivision (//) verwenden. Andernfalls erhalten Sie November (11) plus 1 Monat 12 , was beim Finden des Restes (12% 12) 0 ergibt.
(Und schlagen Sie nicht "(Monat% 12) + 1" oder Okt + 1 = Dezember vor!)
Jedoch ... Dies erklärt kein Problem wie den 31. Januar + einen Monat. Also kehren wir zum OP zurück - was meinst du mit einem Monat? Eine Lösung besteht darin, einen Rückzieher zu machen, bis Sie zu einem gültigen Tag gelangen, da die meisten Leute davon ausgehen würden, dass der letzte Tag im Januar plus ein Monat dem letzten Tag im Februar entspricht. Dies funktioniert auch bei negativen Monaten. Beweis:
quelle
Ich weiß, dass dies für 6 Monate war, aber die Antwort zeigt in Google für "Hinzufügen von Monaten in Python", wenn Sie einen Monat hinzufügen:
Dies würde die Tage im aktuellen Monat zählen und sie zum aktuellen Datum hinzufügen. Wenn Sie 365/12 verwenden, kann ein 1/12 eines Jahres Probleme für kurze / lange Monate verursachen, wenn Sie über das Datum iterieren.
quelle
Es gibt keine direkte Möglichkeit, dies mit Pythons Datum / Uhrzeit zu tun.
Überprüfen Sie den relativedelta-Typ bei python-dateutil . Hier können Sie ein Zeitdelta in Monaten angeben.
quelle
Verwenden Sie einfach die Timetuple- Methode, um die Monate zu extrahieren, Ihre Monate hinzuzufügen und ein neues Datumsobjekt zu erstellen. Wenn es dafür bereits eine Methode gibt, weiß ich es nicht.
Die API ist etwas ungeschickt, dient aber als Beispiel. Funktioniert natürlich auch nicht bei Eckfällen wie dem 31.01.2008 + 1 Monat. :) :)
quelle
new_month % 12
sollte sein(new_month % 12) or 12
. Andernfalls wird eine Fehlermeldung angezeigt, wenn Sie dies im November versuchen. :)Das Dateutil-Paket implementiert solche Funktionen. Aber sei dir bewusst, dass dies naiv sein wird , wie andere bereits betonten.
quelle
Verwenden von Python-Standardbibliotheken, dh ohne
dateutil
oder mit anderen, und Lösen des Problems vom 31. Februar:Testen:
quelle
add_months(datetime.date(2018, 11, 30), 1)
Renditedatetime.date(2019, 12, 30)
(das Jahr sollte 2018 sein, nicht 2019). Verwenden Sie dafür besser eine dedizierte, gut getestete Bibliothek! Wenn Sie wirklich nur Standardbibliotheksmodule verwenden müssen, lesen Sie meine Antwort auf eine ähnliche Frage .Ich habe einen besseren Weg, um das Problem vom 31. Februar zu lösen:
Ich denke, dass es auch mit negativen Zahlen funktioniert (um Monate zu subtrahieren), aber ich habe dies nicht sehr oft getestet.
quelle
Die QDate-Klasse von PyQt4 verfügt über eine Addmonths-Funktion.
quelle
Wie wäre es damit? Keine andere Bibliothek benutzen (
dateutil
) odertimedelta
? aufbauend auf der Antwort vartec habe ich dies getan und ich glaube, es funktioniert:Ich habe es versucht
timedelta
, aber weil es die Tage zählt,365/2
oder6*356/12
nicht immer 6 Monate bedeutet, sondern 182 Tage. z.BIch glaube, dass wir normalerweise davon ausgehen, dass 6 Monate ab einem bestimmten Tag am selben Tag des Monats landen, aber 6 Monate später (dh
2015-03-10
->2015-09-10
, nicht2015-09-08
).Ich hoffe, Sie finden das hilfreich.
quelle
day + datetime.timedelta(6*365/12)
wird nicht immer funktionieren, da einige Jahre 365 Tage und andere 366 Tage haben.Dies beantwortet nicht die spezifische Frage (
datetime
nur mit), aber da andere die Verwendung verschiedener Module vorgeschlagen haben, gibt es hier eine Lösung mitpandas
.Was in Schaltjahren wie erwartet funktioniert
quelle
AddMonths () wurde für die Verwendung in Zope und die Behandlung ungültiger Tagesnummern geändert:
quelle
quelle
quelle
Die Antwort von Johannes Wei im Fall 1new_month = 121 geändert. Dies funktioniert perfekt für mich. Die Monate können positiv oder negativ sein.
quelle
Noch eine andere Lösung - hoffe, es wird jemandem gefallen:
Diese Lösung funktioniert an den Tagen 29, 30, 31 nicht in allen Fällen, daher wird eine robustere Lösung benötigt (was nicht mehr so schön ist :)):
quelle
Aus dieser Antwort siehe parsedatetime . Es folgt ein Codebeispiel. Weitere Details: Komponententest mit vielen Konvertierungsbeispielen in natürlicher Sprache -> JJJJ-MM-TT und offensichtlichen Herausforderungen / Fehlern bei der Konvertierung zur Zeit .
Der obige Code generiert Folgendes von einem MacOSX-Computer:
quelle
In diesem Beispiel kann der Benutzer entscheiden, wie ein Datum zurückgegeben werden soll, bei dem der Tag größer ist als die Anzahl der Tage im Monat.
quelle
vorausgesetzt, Ihre datetime-Variable heißt date:
quelle
Allgemeine Funktion, um das nächste Datum nach / vor x Monaten zu erhalten.
quelle
Ein kurzer Vorschlag ist Arrow
Pip Installationspfeil
quelle
Verwenden Sie das Python-Datum / Uhrzeit-Modul, um datetime.today () ein Zeitdelta von sechs Monaten hinzuzufügen.
http://docs.python.org/library/datetime.html
Sie müssen natürlich die Frage von Johannes Weiß-- angehoben lösen , was sie meinen Sie 6 Monate?
quelle
Das habe ich mir ausgedacht. Es bewegt sich in der richtigen Anzahl von Monaten und Jahren, ignoriert jedoch Tage (was ich in meiner Situation brauchte).
quelle
Ich benutze diese Funktion, um Jahr und Monat zu ändern, aber Tag behalten:
Sie sollten schreiben:
quelle
Ich denke, es wäre sicherer, so etwas zu tun, anstatt Tage manuell hinzuzufügen:
quelle