Tim Golden wrote: > [EMAIL PROTECTED] 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 >>
What about (untested) : import datetime def itEarns(fromDate, toDate) : return (fromDate.year == toDate.year and fromDate.month == toDate.month) 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)) ] candidatePeriods = [(frm, to) for frm, to in periods if itEarns(frm, to)] ?? >> >> 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 -- http://mail.python.org/mailman/listinfo/python-list