I got a very simple thing to to in python:
I need a list of tuples (year,month)
for the last x months starting (and including) from today. So, for x=10 and today(July 2011), the command should output:
[(2011, 7), (2011, 6), (2011, 5), (2011, 4), (2011, 3),
(2011, 2), (2011, 1), (2010, 12), (2010, 11), (2010, 10)]
Only the default datetime implementation of python should be used. I came up with the following solution:
import datetime
[(d.year, d.month) for d in [datetime.date.today()-datetime.timedelta(weeks=4*i) for i in range(0,10)]]
This solution outputs the correct solution for my test cases but I'm not comfortable with this solution: It assumes that a month has four weeks and this is simply not true. I could replace the weeks=4
with days=30
which would make a better solution but it is still not correct.
The other solution which came to my mind is to use simple maths and subtract 1 from a months counter and if the month-counter is 0, subtract 1 from a year counter. The problem with this solution: It requires more code and isn't very readable either.
So how can this be done correctly?
date(2020, 1, 1) today = datetime. date. today() for month in months_between(start_of_2020, today): print(month. strftime("%B %Y")) # January 2020, February 2020, March 2020, …
The month() method is used to get a month's calendar in a multi-line string using the formatmonth() of the TextCalendar class. Year for which the calendar should be generated. Month for which the calendar should be generated.
Using relativedelta
...
import datetime
from dateutil.relativedelta import relativedelta
def get_last_months(start_date, months):
for i in range(months):
yield (start_date.year,start_date.month)
start_date += relativedelta(months = -1)
>>> X = 10
>>> [i for i in get_last_months(datetime.datetime.today(), X)]
>>> [(2013, 2), (2013, 1), (2012, 12), (2012, 11), (2012, 10), (2012, 9), (2012, 8), (2012, 7), (2012, 6), (2012, 5)]
I don't see it documented anywhere, but time.mktime
will "roll over" into the correct year when given out-of-range, including negative, month values:
x = 10
now = time.localtime()
print([time.localtime(time.mktime((now.tm_year, now.tm_mon - n, 1, 0, 0, 0, 0, 0, 0)))[:2] for n in range(x)])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With