Random dates (was RE: Why does this choke?)

Tim Peters tim.one at comcast.net
Sat Nov 8 13:19:14 EST 2003


There's some depressingly fiddly (low-level) code in this thread for
generating a number of random dates in a given year.  Python 2.3 has a new
datetime module that makes mucking with dates easy, and a new
random.sample() function that makes finding a random subset easy.  Combine
the two and you can get some lovely code for this task:


import datetime
import random

def days_in_year(y):
    return datetime.date(y, 12, 31).timetuple().tm_yday

def n_random_dates_in_year(n, year, unique=True):
    """Generate n random dates in year.

    Optional argument 'unique' (default True) controls whether
    duplicate dates can be generated.  By default, unique dates are
    generated, and it's an error to specify n larger than the number
    of days in the year.  When unique is False, there's no limit on
    how large n may be, or on how often a given date may be generated.
    """

    diy = days_in_year(year)
    start = datetime.date(year, 1, 1)
    delta = datetime.timedelta

    if unique:
        if n > diy:
            raise ValueError("year %d doesn't have %d unique days" %
                             (year, n))
        for offset in random.sample(xrange(diy), n):
            yield start + delta(days=offset)
    else:
        for dummy in xrange(n):
            yield start + delta(days=random.randrange(diy))






More information about the Python-list mailing list