Subtract n months from datetime

Paulo da Silva p_d_a_s_i_l_v_a_ns at nonetnoaddress.pt
Tue Jun 21 12:02:24 EDT 2022


Às 05:44 de 21/06/22, Paul Bryan escreveu:
> Here's how my code does it:
> 
> 
> import calendar
> 
> def add_months(value: date, n: int):
>    """Return a date value with n months added (or subtracted if
> negative)."""
>    year = value.year + (value.month - 1 + n) // 12
>    month = (value.month - 1 + n) % 12 + 1
>    day = min(value.day, calendar.monthrange(year, month)[1])
>    return date(year, month, day)
> 
> Paul
I have a datetime, not a date.
Anyway, the use of calendar.monthrange simplifies the task a lot.

Assuming dtnow has the current datetime and dtn the number of months to 
be subtracted, here is my solution (the code was not cleaned yet - just 
a test):
             dtnow_t=list(dtnow.timetuple()[:6]+(dtnow.microsecond,))
             y=dtnow_t[0] # y,m,d,*_=dtnow_t seems slower
             m=dtnow_t[1]
             d=dtnow_t[2]
             dy,dm=divmod(dtn,12)
             y-=dy
             m-=dm
             if m<1:
                 m+=12
                 y-=1
             daysinmonth=calendar.monthrange(y,m)[1]
             d=min(d,daysinmonth)
             dtnow_t[0]=y
             dtnow_t[1]=m
             dtnow_t[2]=d
             bt=datetime.datetime(*dtnow_t)

Any comments are welcome.

Thank you.
Paulo


> 
> On Tue, 2022-06-21 at 05:29 +0100, Paulo da Silva wrote:
>> Hi!
>>
>> I implemented a part of a script to subtract n months from datetime.
>> Basically I subtracted n%12 from year and n//12 from the month adding
>> 12
>> months when it goes<=0. Then used try when converting to datetime
>> again.
>> So, if the day is for example 31 for a 30 days month it raises a
>> ValuError exception. Then I subtract 1 to day and repeat.
>>
>> The code seems too naive and very very complicated!
>> What is the best way to achieve this? Any existent module?
>>
>> At the very end, what I want is to subtract nx where x can be y, m,
>> w, d
>> for respectively years, months, weeks or days.
>>
>> I feel I am missing something here ...
>>
>> Thanks.
>> Paulo
>>
> 



More information about the Python-list mailing list