615 Stimmen

Wie berechne ich mit dem Python-Modul datetime das Datum sechs Monate vor dem aktuellen Datum?

Ich verwende das Python-Modul datetime. Ich möchte das Datum 6 Monate nach dem aktuellen Datum berechnen. Könnte mir jemand ein wenig Hilfe dabei geben?

Der Grund, warum ich ein Datum generieren möchte, das 6 Monate nach dem aktuellen Datum liegt, ist, dass ich eine Datum der Überprüfung . Wenn der Benutzer Daten in das System eingibt, haben diese ein Überprüfungsdatum von 6 Monaten ab dem Datum, an dem er sie eingegeben hat.

20voto

rpanai Punkte 10513

Dies ist keine Antwort auf die konkrete Frage (mit datetime nur), aber da andere die Verwendung verschiedener Module vorgeschlagen haben, gibt es hier eine Lösung mit pandas .

import datetime as dt
import pandas as pd

date = dt.date.today() - \
       pd.offsets.DateOffset(months=6)

print(date)

2019-05-04 00:00:00

Was in Schaltjahren wie erwartet funktioniert

date = dt.datetime(2019,8,29) - \
       pd.offsets.DateOffset(months=6)
print(date)

2019-02-28 00:00:00

20voto

breddi Punkte 209

Für die Berechnung von Monatsanfang zu Monatsende:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)

20voto

user417751 Punkte 189

Diese Lösung funktioniert korrekt für Dezember, was bei den meisten Antworten auf dieser Seite nicht der Fall ist. Sie müssen zuerst die Monate von der Basis 1 (d.h. Jan = 1) zur Basis 0 (d.h. Jan = 0) verschieben, bevor Sie den Modulus ( % ) oder die ganzzahlige Division ( // ) verwenden, sonst ergibt November (11) plus 1 Monat 12, was bei der Ermittlung des Rests ( 12 % 12 ) 0 ergibt.

(Und schlagen Sie nicht "(Monat % 12) + 1" oder Okt + 1 = Dezember vor!)

def AddMonths(d,x):
    newmonth = ((( d.month - 1) + x ) % 12 ) + 1
    newyear  = int(d.year + ((( d.month - 1) + x ) / 12 ))
    return datetime.date( newyear, newmonth, d.day)

Allerdings ... Dies berücksichtigt nicht das Problem des 31. Januar + einen Monat. Also zurück zum OP - was meinen Sie mit dem Hinzufügen eines Monats? Eine Lösung besteht darin, so lange zurückzurechnen, bis ein gültiger Tag erreicht ist, denn die meisten Menschen würden davon ausgehen, dass der letzte Tag des Januars plus ein Monat gleich dem letzten Tag des Februars ist. Dies funktioniert auch bei einer negativen Anzahl von Monaten. Der Beweis:

>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>>

18voto

Johannes Weiss Punkte 49967

Was meinen Sie mit "6 Monaten"?

Ist 2009-02-13 + 6 Monate == 2009-08-13? Oder ist es 2009-02-13 + 6*30 Tage?

import mx.DateTime as dt

#6 Months
dt.now()+dt.RelativeDateTime(months=6)
#result is '2009-08-13 16:28:00.84'

#6*30 days
dt.now()+dt.RelativeDateTime(days=30*6)
#result is '2009-08-12 16:30:03.35'

Mehr Informationen über mx.DateTime

16voto

Akbar ibrahim Punkte 4632

Es gibt keine direkte Möglichkeit, dies mit Pythons datetime zu tun.

Überprüfen Sie den Typ relativedelta unter python-dateutil . Hier können Sie ein Zeitdelta in Monaten angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X