Finding specific date ranges

Tim Golden mail at timgolden.me.uk
Thu Sep 6 17:57:29 CEST 2007


kyosohma at gmail.com wrote:
> Hi,
> 
> I am working on a timesheet application in which I need to to find the
> first pay period in a month that is entirely contained in that month
> to calculate vacation time. Below are some example date ranges:
> 
> 
> December 31, 2006    January 13, 2007 # doesn't earn
> January 14, 2007	January 27, 2007 # does earn
> January 28, 2007	February 10, 2007 # doesn't
> February 11, 2007	February 24, 2007 # does
> 
> 
> So far, the best approach I've come up with is to create a list of
> tuples that contain the pay period date ranges for the year and
> iterate through the tuples looking for the first occurrence of the
> month names matching. Then I'd add that date range to a separate list
> and somehow ignore any other matches in that month. This seems like a
> hack. Does anyone have a better idea?


Well, I can come up with a solution which basically reflects the
way I'd do it in SQL (since this kind of thing is my bread-and-butter
there) but I'm not convinced it's really any better than your proposal.
However, for the purposes of illustration:

<code>
import calendar
import datetime

YEAR = 2007

months = [
   (datetime.date (YEAR, n, 1), datetime.date (YEAR, n, calendar.monthrange (YEAR, n)[1]))
   for n in range (1, 13)
]

periods = [
   (datetime.date(2006, 12, 31), datetime.date(2007, 1, 13)),
   (datetime.date(2007, 1, 14), datetime.date(2007, 1, 27)),
   (datetime.date(2007, 1, 28), datetime.date(2007, 2, 10)),
   (datetime.date(2007, 2, 11), datetime.date(2007, 2, 24))
]

for m in months:
   candidate_periods = [p for p in periods if m[0] <= p[0] and p[1] <= m[1]]
   if candidate_periods:
     print m[0], "=>", min (candidate_periods)
   else:
     print m[0], "=>", "no period matches"

</code>

TJG



More information about the Python-list mailing list