I've added a new function to my python-math library that will return a list—technically a generator—of all of the days between two dates.
There might be a more obvious way to do this, but I don't know it. If you do, please let me know.
<div class="source"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span> <span class="k">def</span><span class="w"> </span><span class="nf">date_range</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Returns a generator of all the days between two date objects.</span> <span class="sd"> </span> <span class="sd"> Results include the start and end dates.</span> <span class="sd"> </span> <span class="sd"> Arguments can be either datetime.datetime or date type objects.</span> <span class="sd"> </span> <span class="sd"> h3. Example usage</span> <span class="sd"> </span> <span class="sd"> &gt;&gt;&gt; import datetime</span> <span class="sd"> &gt;&gt;&gt; import calculate</span> <span class="sd"> &gt;&gt;&gt; dr = calculate.date_range(datetime.date(2009,1,1), datetime.date(2009,1,3))</span> <span class="sd"> &gt;&gt;&gt; dr</span> <span class="sd"> <generator 0x718e90="" at="" object=""></span> <span class="sd"> &gt;&gt;&gt; list(dr)</span> <span class="sd"> [datetime.date(2009, 1, 1), datetime.date(2009, 1, 2), datetime.date(2009, 1, 3)]</span> <span class="sd"> </span> <span class="sd"> """</span> <span class="c1"># If a datetime object gets passed in,</span> <span class="c1"># change it to a date so we can do comparisons.</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span> <span class="n">start_date</span> <span class="o">=</span> <span class="n">start_date</span><span class="o">.</span><span class="n">date</span><span class="p">()</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">end_date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span> <span class="n">end_date</span> <span class="o">=</span> <span class="n">end_date</span><span class="o">.</span><span class="n">date</span><span class="p">()</span> <span class="c1"># Verify that the start_date comes after the end_date.</span> <span class="k">if</span> <span class="n">start_date</span> <span class="o">&</span><span class="n">gt</span><span class="p">;</span> <span class="n">end_date</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'You provided a start_date that comes after the end_date.'</span><span class="p">)</span> <span class="c1"># Jump forward from the start_date...</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="k">yield</span> <span class="n">start_date</span> <span class="c1"># ... one day at a time ...</span> <span class="n">start_date</span> <span class="o">=</span> <span class="n">start_date</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># ... until you reach the end date.</span> <span class="k">if</span> <span class="n">start_date</span> <span class="o">&</span><span class="n">gt</span><span class="p">;</span> <span class="n">end_date</span><span class="p">:</span> <span class="k">break</span> <span class="o"></</span><span class="n">generator</span><span class="o">></span> </pre></div>