Generate a random date between two other dates Generate a random date between two other dates python python

Generate a random date between two other dates


Convert both strings to timestamps (in your chosen resolution, e.g. milliseconds, seconds, hours, days, whatever), subtract the earlier from the later, multiply your random number (assuming it is distributed in the range [0, 1]) with that difference, and add again to the earlier one. Convert the timestamp back to date string and you have a random time in that range.

Python example (output is almost in the format you specified, other than 0 padding - blame the American time format conventions):

import randomimport time    def str_time_prop(start, end, time_format, prop):    """Get a time at a proportion of a range of two formatted times.    start and end should be strings specifying times formatted in the    given format (strftime-style), giving an interval [start, end].    prop specifies how a proportion of the interval to be taken after    start.  The returned time will be in the specified format.    """    stime = time.mktime(time.strptime(start, time_format))    etime = time.mktime(time.strptime(end, time_format))    ptime = stime + prop * (etime - stime)    return time.strftime(time_format, time.localtime(ptime))def random_date(start, end, prop):    return str_time_prop(start, end, '%m/%d/%Y %I:%M %p', prop)    print(random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", random.random()))


from random import randrangefrom datetime import timedeltadef random_date(start, end):    """    This function will return a random datetime between two datetime     objects.    """    delta = end - start    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds    random_second = randrange(int_delta)    return start + timedelta(seconds=random_second)

The precision is seconds. You can increase precision up to microseconds, or decrease to, say, half-hours, if you want. For that just change the last line's calculation.

example run:

from datetime import datetimed1 = datetime.strptime('1/1/2008 1:30 PM', '%m/%d/%Y %I:%M %p')d2 = datetime.strptime('1/1/2009 4:50 AM', '%m/%d/%Y %I:%M %p')print(random_date(d1, d2))

output:

2008-12-04 01:50:17


A tiny version.

import datetimeimport randomdef random_date(start, end):    """Generate a random datetime between `start` and `end`"""    return start + datetime.timedelta(        # Get a random amount of seconds between `start` and `end`        seconds=random.randint(0, int((end - start).total_seconds())),    )

Note that both start and end arguments should be datetime objects. Ifyou've got strings instead, it's fairly easy to convert. The other answers pointto some ways to do so.