2

I know how to generate a datetime object,

datetime.datetime(2006, 1, 1, 0, 0)

But how can I generate a series of datatime object monthly from 2006/1/1 to 2010/1/1

Such as

for dt in [datetime.datetime(2006, 1, 1, 0, 0): datetime.datetime(2010, 1, 1, 0, 0)]:
    print(dt)

Expected result

  • (2006, 1, 1, 0, 0)
  • (2006, 2, 1, 0, 0)
  • (2006, 3, 1, 0, 0)
  • ...
  • (2010, 1, 1, 0, 0)
user3675188
  • 7,271
  • 11
  • 40
  • 76

5 Answers5

2

As this question illustrates, incrementing month in the datetime library is surprisingly challenging. However, if you use the dateutil library as well it becomes much easier:

from dateutil.relativedelta import relativedelta
print [datetime.datetime(2006, 1, 1, 0, 0) + relativedelta(months=i) for i in range(48)]

The linked question also has some solutions for doing this without dateutil, but they are substantially more cumbersome.

Community
  • 1
  • 1
seaotternerd
  • 6,298
  • 2
  • 47
  • 58
2

You could use simple loops:

print [datetime.datetime(y,m,1) for y in range(2006,2010) for m in range(1,13)]
Robᵩ
  • 163,533
  • 20
  • 239
  • 308
0

Update

from calendar import monthrange
import  datetime
from dateutil.relativedelta import relativedelta

def monthdelta(d1, d2):
    delta = 0
    while True:
        mdays = monthrange(d1.year, d1.month)[1]
        d1 += datetime.timedelta(days=mdays)
        if d1 <= d2:
            delta += 1
        else:
            break
    return delta




d0 = datetime.datetime(2007, 8, 1,0)
d1 = datetime.datetime(2008, 9, 1,0)

monthdiff = monthdelta(d0,d1)


print [d0 + relativedelta(months=i) for i in range(monthdiff)]

Calculate monthDiff and use the dateutil

o/p

[datetime.datetime(2007, 8, 1, 0, 0), datetime.datetime(2007, 9, 1, 0, 0), datetime.datetime(2007, 10, 1, 0, 0), datetime.datetime(2007, 11, 1, 0, 0), datetime.datetime(2007, 12, 1, 0, 0), datetime.datetime(2008, 1, 1, 0, 0), datetime.datetime(2008, 2, 1, 0, 0), datetime.datetime(2008, 3, 1, 0, 0), datetime.datetime(2008, 4, 1, 0, 0), datetime.datetime(2008, 5, 1, 0, 0), datetime.datetime(2008, 6, 1, 0, 0), datetime.datetime(2008, 7, 1, 0, 0), datetime.datetime(2008, 8, 1, 0, 0)]
backtrack
  • 7,996
  • 5
  • 52
  • 99
0

With dateutil.rrule,

from datetime import datetime
from dateutil.rrule import rrule, MONTHLY
for dt in rrule(MONTHLY, dtstart=datetime(2006, 1, 1), until=datetime(2010, 1, 1)):
     print(dt)
satomacoto
  • 11,349
  • 2
  • 16
  • 13
0

Using calendar.monthrange as mentioned by @Backtrack to make a generator yielding monthly datetimes. (calendar and datetime are available in the standard library)

import datetime
from calendar import monthrange

def months(start_datetime, end_datetime):
    current_datetime = start_datetime
    while current_datetime <= end_datetime:
        yield current_datetime
        _, days_in_month = monthrange(current_datetime.year, current_datetime.month)
        current_datetime += datetime.timedelta(days=days_in_month) 

Use it like this:

start = datetime.datetime(2006, 1, 1)
end = datetime.datetime(2010, 1, 1)
for month_datetime in months(start, end):
    print(month_datetime)

Will give you results:

datetime.datetime(2006, 1, 1, 0, 0)
datetime.datetime(2006, 2, 1, 0, 0)
datetime.datetime(2006, 3, 1, 0, 0)
datetime.datetime(2006, 4, 1, 0, 0)
datetime.datetime(2006, 5, 1, 0, 0)
datetime.datetime(2006, 6, 1, 0, 0)
datetime.datetime(2006, 7, 1, 0, 0)
...
datetime.datetime(2010, 1, 1, 0, 0)
monkut
  • 42,176
  • 24
  • 124
  • 155