Skip to content

Instantly share code, notes, and snippets.

@Quard
Created August 15, 2013 08:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Quard/6239114 to your computer and use it in GitHub Desktop.
Save Quard/6239114 to your computer and use it in GitHub Desktop.
simple date range iterator
from datetime import datetime, date, timedelta
class date_range(object):
def __init__(self, since, until, step=timedelta(days=1)):
assert isinstance(since, (datetime, date))
assert isinstance(until, (datetime, date))
assert isinstance(step, timedelta)
self.since = since
self.until = until
self.step = step
self.current = since - step
def __iter__(self):
return self
def next(self):
if self.current >= self.until:
raise StopIteration()
self.current += self.step
if self.current > self.until:
return self.until
return self.current
def test():
d_range = list(date_range(date(2000, 1, 1), date(2000, 1, 3)))
e_range = [date(2000, 1, 1), date(2000, 1, 2), date(2000, 1, 3)]
assert d_range == e_range, d_range
d_range = list(date_range(
date(2000, 1, 1),
date(2000, 2, 3),
timedelta(days=7)
))
e_range = [
date(2000, 1, 1),
date(2000, 1, 8),
date(2000, 1, 15),
date(2000, 1, 22),
date(2000, 1, 29),
date(2000, 2, 3),
]
assert d_range == e_range, d_range
if __name__ == '__main__':
test()
@thekrugers
Copy link

I've added some stuff to my fork of this gist:

  • A zero step value is caught as it could cause and infinite loop
  • A negative step value can be used
  • Getting since and until the wrong way around (since after until) is silently corrected

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment