Here's a function I wrote earlier today that should calculate an adjusted monthly average, prorating a monthly number as if the month was 30 days in length. The idea is to compare numbers from different months against each other and prevent longer months from returning higher values simply because they contain more days.
The script is included with a variety of other math tools I've collected on Github under the name python-math.
Per usual, if I screwed something up, just let me know. We'll get it ironed out.
<div class="source"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">calendar</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">adjusted_monthly_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Accepts a value and a datetime object, and</span> <span class="sd"> then prorates the value to a 30-day figure</span> <span class="sd"> depending on how many days are in the month.</span> <span class="sd"> </span> <span class="sd"> This can be useful for month-to-month comparisons</span> <span class="sd"> in circumstances where fluctuations in the number</span> <span class="sd"> of days per month may skew the analysis. </span> <span class="sd"> </span> <span class="sd"> For instance, February typically has only 28 days, in </span> <span class="sd"> comparison to March, which has 31.</span> <span class="sd"> </span> <span class="sd"> h3. Example usage</span> <span class="sd"> </span> <span class="sd"> &gt;&gt; import calculate</span> <span class="sd"> &gt;&gt; calculate.adjusted_monthly_value(10, datetime.datetime(2009, 4, 1))</span> <span class="sd"> 10.0</span> <span class="sd"> &gt;&gt; calculate.adjusted_monthly_value(10, datetime.datetime(2009, 2, 17))</span> <span class="sd"> 10.714285714285714</span> <span class="sd"> &gt;&gt; calculate.adjusted_monthly_value(10, datetime.datetime(2009, 12, 31))</span> <span class="sd"> 9.67741935483871</span> <span class="sd"> </span> <span class="sd"> h3. Documentation</span> <span class="sd"> </span> <span class="sd"> "calendar module":http://docs.python.org/library/calendar.html</span> <span class="sd"> </span> <span class="sd"> """</span> <span class="c1"># Test to make sure the first input is a number</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span><span class="n">long</span><span class="p">,</span><span class="nb">float</span><span class="p">)):</span> <span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Input values should be a number, your input is a </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">))</span> <span class="c1"># Test to make sure the second input is a date</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dt</span><span class="p">,</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">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">)):</span> <span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'The submitted month should be a date or datetime value, you input a </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">dt</span><span class="p">))</span> <span class="c1"># Get the length of the month</span> <span class="n">length_of_month</span> <span class="o">=</span> <span class="n">calendar</span><span class="o">.</span><span class="n">monthrange</span><span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">month</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># Determine the adjustment necessary to pro-rate the value to 30 days.</span> <span class="n">adjustment</span> <span class="o">=</span> <span class="mf">30.0</span><span class="o">/</span><span class="n">length_of_month</span> <span class="c1"># Multiply the value against the adjustment and return the result</span> <span class="k">return</span> <span class="n">value</span> <span class="o">*</span> <span class="n">adjustment</span> </pre></div>