Fügen Sie einen Monat zu einem bestimmten Datum (abgerundeter Tag danach) mit Python hinzu

8

Ich möchte einen Monat zu einem bestimmten Datum hinzufügen

%Vor%

also sollte ich

bekommen %Vor%

aber mit

%Vor%

Ich sollte

bekommen %Vor%

, weil es keine 2015.02.31 (und ich möchte mein Ergebnis Runde 1 Tag wird nach )

Einige Monate haben 31 Tage, andere 30, manche 29, manche 28!

Zugabe so ein datetime.timedelta ist wahrscheinlich keine gute Art und Weise zu tun (weil wir die Anzahl der Tage, wissen nicht, hinzuzufügen)

Ich habe bemerkt, dass Pandas ein interessantes Konzept von DateOffset

haben

Ссылка

, aber ich habe kein Month versetzt, nur MonthBegin oder MonthEnd

finden

Ich sehe auch diesen Beitrag Wie Ich berechne das Datum sechs Monate vom aktuellen Datum mit dem Datetime Python-Modul?

Ich habe also dateutil.relativedelta versucht, aber

%Vor%

gibt

zurück %Vor%

Das Ergebnis wurde einen Tag vor gerundet.

Gibt es einen (sauberen) Weg zum runden Tag nach ?

bearbeiten: Ich hatte ein Beispiel mit einem Monat hinzufügen, aber ich mag auch zum Beispiel hinzufügen können: 2 Jahre und 6 Monate (a relativedelta(years=2, months=6) verwenden)

    
scls 28.01.2015, 09:45
quelle

3 Antworten

3

Sie können dateutil.relativedelta.relativedelta verwenden und die datetime.day Attribut, wenn der ursprüngliche Tag größer als der neue Tag ist, dann füge einen Tag hinzu.

Die folgende Funktion akzeptiert ein Objekt datetime und relativedelta . Beachten Sie, dass der unten stehende Code nur für Jahre und Monate funktioniert. Ich glaube nicht, dass es funktioniert, wenn Sie etwas darunter verwenden (Tage, Stunden usw.). Sie könnten diese Funktion leicht ändern, um years und months als Argumente zu verwenden und dann relativedelta in der Funktion selbst zu konstruieren.

%Vor%     
Ffisegydd 28.01.2015, 10:03
quelle
2

Das scheint zu funktionieren. Es ist ziemlich sauber, aber nicht schön:

%Vor%

druckt:

%Vor%

Sie fügt hinzu, einen Monat und versucht, den Tag mit dem Original-Tag zu ersetzen. Wenn es gelingt, ist es kein besonderer Fall. Wenn es fehlschlägt (ValueError), müssen wir einen weiteren Monat hinzufügen und zu seinem ersten Tag gehen.

    
eumiro 28.01.2015 10:05
quelle
0

Schnelle Lösung:

%Vor%

Ausgang für den ersten Eingang (year=2014, month=5, day=2) :

%Vor%

Ausgang für den zweiten Eingang (year=2015, month=1, day=31) :

%Vor%     
user3 28.01.2015 10:02
quelle