weekdays in range

Ben Finney ben+python at benfinney.id.au
Sun Oct 18 04:30:14 EDT 2009


Jive Dadson <notontheweb at noisp.com> writes:

> Ben Finney wrote:
> >     >>> friday_weekday = 4
> >     >>> len([
> >     ...     date for date in (
> >     ...         begin_date + datetime.timedelta(days)
> >     ...         for days in range((end_date - begin_date).days))
> >     ...     if calendar.weekday(date.year, date.month, date.day) <= friday_weekday])
> >     9
> >
>
> Thanks for your help. For a non-expert at Python, that last compound
> statement is pretty inscrutable.  I am trying to scrute it.  Wish me
> luck.

I'll help you by showing (liberally editing to make me look
reptrospectively clever) how I built it up:

    >>> import datetime
    >>> import calendar
    >>> import pprint

    >>> begin_date = datetime.date(2009, 10, 9)
    >>> end_date = datetime.date(2009, 10, 22)

    >>> end_date - begin_date
    datetime.timedelta(13)
    >>> (end_date - begin_date).days
    13
    >>> range((end_date - begin_date).days)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

    >>> begin_date + datetime.timedelta(0)
    datetime.date(2009, 10, 9)
    >>> begin_date + datetime.timedelta(1)
    datetime.date(2009, 10, 10)
    >>> (begin_date + datetime.timedelta(days)
    ...     for days in range((end_date - begin_date).days))
    <generator object at 0xf78c08f0>

    >>> [
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     ]
    [datetime.date(2009, 10, 9), datetime.date(2009, 10, 10), datetime.date(2009, 10, 11), datetime.date(2009, 10, 12), datetime.date(2009, 10, 13), datetime.date(2009, 10, 14), datetime.date(2009, 10, 15), datetime.date(2009, 10, 16), datetime.date(2009, 10, 17), datetime.date(2009, 10, 18), datetime.date(2009, 10, 19), datetime.date(2009, 10, 20), datetime.date(2009, 10, 21)]
    >>> pprint.pprint([
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     ])
    [datetime.date(2009, 10, 9),
     datetime.date(2009, 10, 10),
     datetime.date(2009, 10, 11),
     datetime.date(2009, 10, 12),
     datetime.date(2009, 10, 13),
     datetime.date(2009, 10, 14),
     datetime.date(2009, 10, 15),
     datetime.date(2009, 10, 16),
     datetime.date(2009, 10, 17),
     datetime.date(2009, 10, 18),
     datetime.date(2009, 10, 19),
     datetime.date(2009, 10, 20),
     datetime.date(2009, 10, 21)]
    >>> len([
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     ])
    13

    >>> friday_weekday = 4
    >>> calendar.weekday(begin_date.year, begin_date.month, begin_date.day)
    4
    >>> calendar.weekday(end_date.year, end_date.month, end_date.day)
    3

    >>> [
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     if calendar.weekday(date.year, date.month, date.day) <= friday_weekday]
    [datetime.date(2009, 10, 9), datetime.date(2009, 10, 12), datetime.date(2009, 10, 13), datetime.date(2009, 10, 14), datetime.date(2009, 10, 15), datetime.date(2009, 10, 16), datetime.date(2009, 10, 19), datetime.date(2009, 10, 20), datetime.date(2009, 10, 21)]
    >>> pprint.pprint([
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     if calendar.weekday(date.year, date.month, date.day) <= friday_weekday])
    [datetime.date(2009, 10, 9),
     datetime.date(2009, 10, 12),
     datetime.date(2009, 10, 13),
     datetime.date(2009, 10, 14),
     datetime.date(2009, 10, 15),
     datetime.date(2009, 10, 16),
     datetime.date(2009, 10, 19),
     datetime.date(2009, 10, 20),
     datetime.date(2009, 10, 21)]
    >>> len([
    ...     date for date in (
    ...         begin_date + datetime.timedelta(days)
    ...         for days in range((end_date - begin_date).days))
    ...     if calendar.weekday(date.year, date.month, date.day) <= friday_weekday])
    9

-- 
 \     “We are all agreed that your theory is crazy. The question that |
  `\      divides us is whether it is crazy enough to have a chance of |
_o__)            being correct.” —Niels Bohr (to Wolfgang Pauli), 1958 |
Ben Finney



More information about the Python-list mailing list