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