213

How would I generate a random date that has to be between two other given dates?

The function's signature should be something like this:

random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", 0.34)
                   ^                       ^          ^

            date generated has  date generated has  a random number
            to be after this    to be before this

and would return a date such as: 2/4/2008 7:20 PM

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
quilby
  • 3,141
  • 4
  • 26
  • 21
  • The way the question is presented at the moment it isn't clear whether or not you only want the date or the time to be random. Your example suggests that you are looking for a time. If it has to be in between the two dates you may want to modify the answers given so far to suit your needs and exclude the end and start time. Lastly, in most answers, such as the accepted one, the code outputs a datetime exclusive the endtime due to truncating to int. To generate a time that may include the end in the answer change the code to `ptime = stime + prop * (etime - stime) + 0.5` – tortal Aug 26 '16 at 15:33
  • Yes, probably the question was about interpolation, and everybody who finds it wants a random date :) – Tomasz Gandor Jan 08 '21 at 00:33

31 Answers31

198

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 random
import 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()))
Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Tom Alsberg
  • 6,873
  • 3
  • 28
  • 14
157
from random import randrange
from datetime import timedelta

def 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 datetime

d1 = 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
Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
nosklo
  • 217,122
  • 57
  • 293
  • 297
  • 3
    The use of the `start` variable in that case is perfectly right. The only problem I see in the code is the use of `seconds` attribute from the resultant `delta`. That wouldn't return the total number of seconds in the whole interval; instead, it's just the number of seconds from the 'time' component (something between 0 and 60); a `timedelta` object has a `total_seconds` method, that should be used instead. – emyller Nov 17 '11 at 16:21
  • 8
    @emyller: No, I'm using `(delta.days * 24 * 60 * 60) + delta.seconds` which results in the total seconds. The `total_seconds()` method is new in python 2.7 and didn't exist back in 2009 when I answered the question. If you have python 2.7 you should use that instead, but the code works fine as it is. – nosklo Nov 22 '11 at 11:12
  • I wasn't aware of the inexistence of this method back in 2.7-. I just checked that a timedelta object is basically composed of numbers of days and seconds, so you're right. :-) – emyller Nov 23 '11 at 13:36
  • 1
    @emyller: Just for completeness, the timedelta object is composed of **days, seconds and microseconds**. Precision of random date generating code above is up to seconds, but it could be changed, as I mentioned in the answer. – nosklo Nov 24 '11 at 03:24
122

Updated answer

It's even more simple using Faker.

Installation

pip install faker

Usage:

from faker import Faker
fake = Faker()

fake.date_between(start_date='today', end_date='+30y')
# datetime.date(2025, 3, 12)

fake.date_time_between(start_date='-30y', end_date='now')
# datetime.datetime(2007, 2, 28, 11, 28, 16)

# Or if you need a more specific date boundaries, provide the start 
# and end dates explicitly.
import datetime
start_date = datetime.date(year=2015, month=1, day=1)
fake.date_between(start_date=start_date, end_date='+30y')

Old answer

It's very simple using radar

Installation

pip install radar

Usage

import datetime

import radar 

# Generate random datetime (parsing dates from str values)
radar.random_datetime(start='2000-05-24', stop='2013-05-24T23:59:59')

# Generate random datetime from datetime.datetime values
radar.random_datetime(
    start = datetime.datetime(year=2000, month=5, day=24),
    stop = datetime.datetime(year=2013, month=5, day=24)
)

# Just render some random datetime. If no range is given, start defaults to 
# 1970-01-01 and stop defaults to datetime.datetime.now()
radar.random_datetime()
Artur Barseghyan
  • 12,746
  • 4
  • 52
  • 44
  • 3
    upvote for suggesting faker module.. I was using to generate profile but didn't used date utility faker is a very good module while testing. – Gahan Apr 05 '18 at 06:45
  • I am getting the output in this format `datetime.date(2039, 3, 16)` But I want output like this `2039-03-16`. How to do that? – Ayush Kumar May 07 '18 at 19:20
  • Do you mean, you want a string? Very easy (just format it accordingly): `fake.date_between(start_date='today', end_date='+30y').strftime('%Y-%m-%d')`. – Artur Barseghyan May 07 '18 at 19:43
  • 1
    Upvote for using an incredible library, even if you have to install it. This reduces the complexity of the implementation to essentially 4 lines. – Blairg23 Oct 25 '18 at 22:53
  • I am late in this discussion. I really like Faker, but is there a way to specify start_date as '2015-01-01" instead of '-3y'. I checked their documentation, but didn't see. I found it odd that they choice the '-3y' format. – KubiK888 Nov 09 '18 at 20:06
  • 1
    @KubiK888: Sure, see my updates answer. You should simply provide the start_date explicitly. – Artur Barseghyan Nov 09 '18 at 21:54
  • @amchugh89 if someone is writing something serious, your answer is incorrect for a number of edge cases, whereas just using a library is a) easy b) has been [thought out](https://github.com/joke2k/faker/blob/master/faker/providers/date_time/__init__.py#L1644-L1681). – Boris Verkhovskiy Aug 30 '19 at 07:44
  • radar is awasome! saved a lot of time and lines of mine – Tech Nov 22 '20 at 18:40
  • 10/10 for faker, although idk why it does not appear in autocomplete – Van Teo Le May 12 '23 at 04:21
103

A tiny version.

import datetime
import random


def 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. If you've got strings instead, it's fairly easy to convert. The other answers point to some ways to do so.

emyller
  • 2,648
  • 1
  • 24
  • 16
29

This is a different approach - that sort of works..

from random import randint
import datetime

date=datetime.date(randint(2005,2025), randint(1,12),randint(1,28))

BETTER APPROACH

startdate=datetime.date(YYYY,MM,DD)
date=startdate+datetime.timedelta(randint(1,365))
amchugh89
  • 1,276
  • 1
  • 14
  • 33
  • 2
    The first approach will never choose a date ending on the 29th, 30th or 31st and your second approach doesn't account for leap years, when the year is 366 days, ie if `startdate` + 1 year passes through December 31st on a leap year, this code will never chose the same date exactly a year later. Both approaches only let you specify a start date and how many years in the future, whereas the question was asking about specifying two dates, and in my opinion that's a more useful API. – Boris Verkhovskiy Aug 30 '19 at 07:12
24

Since Python 3 timedelta supports multiplication with floats, so now you can do:

import random
random_date = start + (end - start) * random.random()

given that start and end are of the type datetime.datetime. For example, to generate a random datetime within the next day:

import random
from datetime import datetime, timedelta

start = datetime.now()
end = start + timedelta(days=1)
random_date = start + (end - start) * random.random()
Pieter Bos
  • 1,554
  • 1
  • 12
  • 20
6

To chip in a pandas-based solution I use:

import pandas as pd
import numpy as np

def random_date(start, end, position=None):
    start, end = pd.Timestamp(start), pd.Timestamp(end)
    delta = (end - start).total_seconds()
    if position is None:
        offset = np.random.uniform(0., delta)
    else:
        offset = position * delta
    offset = pd.offsets.Second(offset)
    t = start + offset
    return t

I like it, because of the nice pd.Timestamp features that allow me to throw different stuff and formats at it. Consider the following few examples...

Your signature.

>>> random_date(start="1/1/2008 1:30 PM", end="1/1/2009 4:50 AM", position=0.34)
Timestamp('2008-05-04 21:06:48', tz=None)

Random position.

>>> random_date(start="1/1/2008 1:30 PM", end="1/1/2009 4:50 AM")
Timestamp('2008-10-21 05:30:10', tz=None)

Different format.

>>> random_date('2008-01-01 13:30', '2009-01-01 4:50')
Timestamp('2008-11-18 17:20:19', tz=None)

Passing pandas/datetime objects directly.

>>> random_date(pd.datetime.now(), pd.datetime.now() + pd.offsets.Hour(3))
Timestamp('2014-03-06 14:51:16.035965', tz=None)
metakermit
  • 21,267
  • 15
  • 86
  • 95
  • And how would you create a random datetime Series elegantly (i.e., without iterating your function for each element)? – dmvianna Oct 23 '14 at 04:00
  • Well, it's maybe possible to modify the function to generate an array of `delta` values and map them all at once to timestamps. Personally, though, I would prefer to just do something like `pd.Series([5] * 10, [random_date('2014-01-01', '2014-01-30') for i in range(10)])`. – metakermit Oct 23 '14 at 22:09
4

Convert your dates into timestamps and call random.randint with the timestamps, then convert the randomly generated timestamp back into a date:

from datetime import datetime
import random

def random_date(first_date, second_date):
    first_timestamp = int(first_date.timestamp())
    second_timestamp = int(second_date.timestamp())
    random_timestamp = random.randint(first_timestamp, second_timestamp)
    return datetime.fromtimestamp(random_timestamp)

Then you can use it like this

from datetime import datetime

d1 = datetime.strptime("1/1/2018 1:30 PM", "%m/%d/%Y %I:%M %p")
d2 = datetime.strptime("1/1/2019 4:50 AM", "%m/%d/%Y %I:%M %p")

random_date(d1, d2)

random_date(d2, d1)  # ValueError because the first date comes after the second date

If you care about timezones you should just use date_time_between_dates from the Faker library, where I stole this code from, as a different answer already suggests.

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
4
# needed to create data for 1000 fictitious employees for testing code 
# code relating to randomly assigning forenames, surnames, and genders
# has been removed as not germaine to the question asked above but FYI
# genders were randomly assigned, forenames/surnames were web scrapped,
# there is no accounting for leap years, and the data stored in mySQL
   
import random 
from datetime import datetime
from datetime import timedelta

for employee in range(1000):
    # assign a random date of birth (employees are aged between sixteen and sixty five)
    dlt = random.randint(365*16, 365*65)
    dob = datetime.today() - timedelta(days=dlt)
    # assign a random date of hire sometime between sixteenth birthday and today
    doh = datetime.today() - timedelta(days=random.randint(0, dlt-365*16))
    print("born {} hired {}".format(dob.strftime("%d-%m-%y"), doh.strftime("%d-%m-%y")))
Clarius
  • 1,183
  • 10
  • 10
3

You can Use Mixer,

pip install mixer

and,

from mixer import generators as gen
print gen.get_datetime(min_datetime=(1900, 1, 1, 0, 0, 0), max_datetime=(2020, 12, 31, 23, 59, 59))
Nima Soroush
  • 12,242
  • 4
  • 52
  • 53
  • 1
    syntax has changed a bit, not sure how to do the above, but a django object will have a random date filled like so: `client = mixer.blend(Client, date=mixer.RANDOM)` – tutuDajuju Aug 28 '15 at 14:10
  • @tutuDajuju : What is the Client standing for? – Nima Soroush Aug 29 '15 at 08:37
  • According to [their docs](https://mixer.readthedocs.org/en/latest/), it can be a Django, SQLAlchemy or Mongoengine model class. – tutuDajuju Aug 30 '15 at 10:31
3

Here is an answer to the literal meaning of the title rather than the body of this question:

import time
import datetime
import random

def date_to_timestamp(d) :
  return int(time.mktime(d.timetuple()))

def randomDate(start, end):
  """Get a random date between two dates"""

  stime = date_to_timestamp(start)
  etime = date_to_timestamp(end)

  ptime = stime + random.random() * (etime - stime)

  return datetime.date.fromtimestamp(ptime)

This code is based loosely on the accepted answer.

Zach Dwiel
  • 529
  • 1
  • 4
  • 18
  • you could change the second last line to `ptime = random.randint(stime, etime)` it's marginally more correct because `randint` produces an inclusive range. – Boris Verkhovskiy Aug 30 '19 at 08:21
2

Just to add another one:

datestring = datetime.datetime.strftime(datetime.datetime( \
    random.randint(2000, 2015), \
    random.randint(1, 12), \
    random.randint(1, 28), \
    random.randrange(23), \
    random.randrange(59), \
    random.randrange(59), \
    random.randrange(1000000)), '%Y-%m-%d %H:%M:%S')

The day handling needs some considerations. With 28 you are on the secure site.

tobmei05
  • 401
  • 1
  • 5
  • 8
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Create random datetime object."""

from datetime import datetime
import random


def create_random_datetime(from_date, to_date, rand_type='uniform'):
    """
    Create random date within timeframe.

    Parameters
    ----------
    from_date : datetime object
    to_date : datetime object
    rand_type : {'uniform'}

    Examples
    --------
    >>> random.seed(28041990)
    >>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
    datetime.datetime(1998, 12, 13, 23, 38, 0, 121628)
    >>> create_random_datetime(datetime(1990, 4, 28), datetime(2000, 12, 31))
    datetime.datetime(2000, 3, 19, 19, 24, 31, 193940)
    """
    delta = to_date - from_date
    if rand_type == 'uniform':
        rand = random.random()
    else:
        raise NotImplementedError('Unknown random mode \'{}\''
                                  .format(rand_type))
    return from_date + rand * delta


if __name__ == '__main__':
    import doctest
    doctest.testmod()
Martin Thoma
  • 124,992
  • 159
  • 614
  • 958
1

It's modified method of @(Tom Alsberg). I modified it to get date with milliseconds.

import random
import time
import datetime

def random_date(start_time_string, end_time_string, format_string, random_number):
    """
    Get a time at a proportion of a range of two formatted times.
    start and end should be strings specifying times formated 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.
    """
    dt_start = datetime.datetime.strptime(start_time_string, format_string)
    dt_end = datetime.datetime.strptime(end_time_string, format_string)

    start_time = time.mktime(dt_start.timetuple()) + dt_start.microsecond / 1000000.0
    end_time = time.mktime(dt_end.timetuple()) + dt_end.microsecond / 1000000.0

    random_time = start_time + random_number * (end_time - start_time)

    return datetime.datetime.fromtimestamp(random_time).strftime(format_string)

Example:

print TestData.TestData.random_date("2000/01/01 00:00:00.000000", "2049/12/31 23:59:59.999999", '%Y/%m/%d %H:%M:%S.%f', random.random())

Output: 2028/07/08 12:34:49.977963

TukanF1
  • 25
  • 2
1

Here's a solution modified from emyller's approach which returns an array of random dates at any resolution

import numpy as np

def random_dates(start, end, size=1, resolution='s'):
    """
    Returns an array of random dates in the interval [start, end]. Valid 
    resolution arguments are numpy date/time units, as documented at: 
        https://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html
    """
    start, end = np.datetime64(start), np.datetime64(end)
    delta = (end-start).astype('timedelta64[{}]'.format(resolution))
    delta_mat = np.random.randint(0, delta.astype('int'), size)
    return start + delta_mat.astype('timedelta64[{}]'.format(resolution))

Part of what's nice about this approach is that np.datetime64 is really good at coercing things to dates, so you can specify your start/end dates as strings, datetimes, pandas timestamps... pretty much anything will work.

David Marx
  • 8,172
  • 3
  • 45
  • 66
1
  1. Convert your input dates to numbers (int, float, whatever is best for your usage)
  2. Choose a number between your two date numbers.
  3. Convert this number back to a date.

Many algorithms for converting date to and from numbers are already available in many operating systems.

mouviciel
  • 66,855
  • 13
  • 106
  • 140
1

What do you need the random number for? Usually (depending on the language) you can get the number of seconds/milliseconds from the Epoch from a date. So for a randomd date between startDate and endDate you could do:

  1. compute the time in ms between startDate and endDate (endDate.toMilliseconds() - startDate.toMilliseconds())
  2. generate a number between 0 and the number you obtained in 1
  3. generate a new Date with time offset = startDate.toMilliseconds() + number obtained in 2
tehvan
  • 10,189
  • 5
  • 27
  • 31
1

The easiest way of doing this is to convert both numbers to timestamps, then set these as the minimum and maximum bounds on a random number generator.

A quick PHP example would be:

// Find a randomDate between $start_date and $end_date
function randomDate($start_date, $end_date)
{
    // Convert to timetamps
    $min = strtotime($start_date);
    $max = strtotime($end_date);

    // Generate random number using above bounds
    $val = rand($min, $max);

    // Convert back to desired date format
    return date('Y-m-d H:i:s', $val);
}

This function makes use of strtotime() to convert a datetime description into a Unix timestamp, and date() to make a valid date out of the random timestamp which has been generated.

ConroyP
  • 40,958
  • 16
  • 80
  • 86
1

Alternative way to create random dates between two dates using np.random.randint(), pd.Timestamp().value and pd.to_datetime() with for loop:

# Import libraries
import pandas as pd

# Initialize
start = '2020-01-01' # Specify start date
end = '2020-03-10' # Specify end date
n = 10 # Specify number of dates needed

# Get random dates
x = np.random.randint(pd.Timestamp(start).value, pd.Timestamp(end).value,n)
random_dates = [pd.to_datetime((i/10**9)/(60*60)/24, unit='D').strftime('%Y-%m-%d')  for i in x]

print(random_dates)

Output

['2020-01-06',
 '2020-03-08',
 '2020-01-23',
 '2020-02-03',
 '2020-01-30',
 '2020-01-05',
 '2020-02-16',
 '2020-03-08',
 '2020-02-09',
 '2020-01-04']
Nilesh Ingle
  • 1,777
  • 11
  • 17
1

Get random date between start_date and end_date. If any of them is None, then get random date between today and past 100 years.

class GetRandomDateMixin:
    def get_random_date(self, start_date=None, end_date=None):
        """
        get random date between start_date and end_date.
        If any of them is None, then get random date between
        today and past 100 years.
        :param start_date: datetime obj.
            eg: datetime.datetime(1940, 1, 1).date()
        :param end_date: datetime obj
        :return: random date
        """
        if start_date is None or end_date is None:

            end_date = datetime.datetime.today().date()
            start_date = end_date - datetime.timedelta(
                days=(100 * 365)
            )

        delta = end_date - start_date
        random_days = random.randint(1, delta.days)
        new_date = start_date + datetime.timedelta(
            days=random_days
        )

        return new_date
Aseem
  • 5,848
  • 7
  • 45
  • 69
1

Building off of @Pieter Bos 's answer:

import random
import datetime

start = datetime.date(1980, 1, 1)
end = datetime.date(2000, 1, 1)

random_date = start + (end - start) * random.random()
random_date = datetime.datetime.combine(random_date, datetime.datetime.min.time())
Tyler Houssian
  • 365
  • 4
  • 7
1

Use my randomtimestamp module. It has 3 functions, randomtimestamp, random_time, and random_date.

Below is the signature of randomtimestamp function. It can generate a random timestamp between two years, or two datetime objects (if you like precision).

There's option to get the timestamp as a datetime object or string. Custom patterns are also supported (like strftime)

randomtimestamp(
    start_year: int = 1950,
    end_year: int = None,
    text: bool = False,
    start: datetime.datetime = None,
    end: datetime.datetime = None,
    pattern: str = "%d-%m-%Y %H:%M:%S"
  ) -> Union[datetime, str]:

Example:

>>> randomtimestamp(start_year=2020, end_year=2021)
datetime.datetime(2021, 1, 10, 5, 6, 19)

>>> start = datetime.datetime(2020, 1, 1, 0, 0, 0)
>>> end = datetime.datetime(2021, 12, 31, 0, 0, 0)

>>> randomtimestamp(start=start, end=end)
datetime.datetime(2020, 7, 14, 14, 12, 32)

Why not faker?

Because randomtimestamp is lightweight and fast. As long as random timestamps are the only thing you need, faker is an overkill and also heavy (being feature rich).

Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
ByteBaker
  • 11
  • 1
  • Please review the rules on [self-promotion](https://stackoverflow.com/help/promotion). You _must_ declare your association with any package that you promote in an answer. – snakecharmerb Aug 15 '21 at 11:38
0

I made this for another project using random and time. I used a general format from time you can view the documentation here for the first argument in strftime(). The second part is a random.randrange function. It returns an integer between the arguments. Change it to the ranges that match the strings you would like. You must have nice arguments in the tuple of the second arugment.

import time
import random


def get_random_date():
    return strftime("%Y-%m-%d %H:%M:%S",(random.randrange(2000,2016),random.randrange(1,12),
    random.randrange(1,28),random.randrange(1,24),random.randrange(1,60),random.randrange(1,60),random.randrange(1,7),random.randrange(0,366),1))
user2723240
  • 803
  • 1
  • 13
  • 23
0

In python:

>>> from dateutil.rrule import rrule, DAILY
>>> import datetime, random
>>> random.choice(
                 list(
                     rrule(DAILY, 
                           dtstart=datetime.date(2009,8,21), 
                           until=datetime.date(2010,10,12))
                     )
                 )
datetime.datetime(2010, 2, 1, 0, 0)

(need python dateutil library – pip install python-dateutil)

Artur
  • 25
  • 1
0

Pandas + numpy solution

import pandas as pd
import numpy as np

def RandomTimestamp(start, end):
    dts = (end - start).total_seconds()
    return start + pd.Timedelta(np.random.uniform(0, dts), 's')

dts is the difference between timestamps in seconds (float). It is then used to create a pandas timedelta between 0 and dts, that is added to the start timestamp.

Carlos Santos
  • 356
  • 4
  • 4
0

Based on the answer by mouviciel, here is a vectorized solution using numpy. Convert the start and end dates to ints, generate an array of random numbers between them, and convert the whole array back to dates.

import time
import datetime
import numpy as np

n_rows = 10

start_time = "01/12/2011"
end_time = "05/08/2017"

date2int = lambda s: time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())
int2date = lambda s: datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S')

start_time = date2int(start_time)
end_time = date2int(end_time)

random_ints = np.random.randint(low=start_time, high=end_time, size=(n_rows,1))
random_dates = np.apply_along_axis(int2date, 1, random_ints).reshape(n_rows,1)

print random_dates
spring
  • 271
  • 3
  • 5
0
start_timestamp = time.mktime(time.strptime('Jun 1 2010  01:33:00', '%b %d %Y %I:%M:%S'))
end_timestamp = time.mktime(time.strptime('Jun 1 2017  12:33:00', '%b %d %Y %I:%M:%S'))
time.strftime('%b %d %Y %I:%M:%S',time.localtime(randrange(start_timestamp,end_timestamp)))

refer

muthu
  • 148
  • 1
  • 11
0

Conceptually it's quite simple. Depending on which language you're using you will be able to convert those dates into some reference 32 or 64 bit integer, typically representing seconds since epoch (1 January 1970) otherwise known as "Unix time" or milliseconds since some other arbitrary date. Simply generate a random 32 or 64 bit integer between those two values. This should be a one liner in any language.

On some platforms you can generate a time as a double (date is the integer part, time is the fractional part is one implementation). The same principle applies except you're dealing with single or double precision floating point numbers ("floats" or "doubles" in C, Java and other languages). Subtract the difference, multiply by random number (0 <= r <= 1), add to start time and done.

cletus
  • 616,129
  • 168
  • 910
  • 942
0

What about

import datetime
import random


def random_date(begin: datetime.datetime, end: datetime.datetime):
    epoch = datetime.datetime(1970, 1, 1)
    begin_seconds = int((begin - epoch).total_seconds())
    end_seconds = int((end - epoch).total_seconds())
    dt_seconds = random.randint(begin_seconds, end_seconds)

    return datetime.datetime.fromtimestamp(dt_seconds)

Haven't tried it with "epoch" years different than 1970 but it does the job

lupodellasleppa
  • 124
  • 1
  • 1
  • 11
0

Generates random dates between last 50 yrs to last 30 years. And generates date only.

import random
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

start_date = date.today() - relativedelta(years=50)
end_date = date.today() - relativedelta(years=20)
delta = end_date - start_date
print(delta.days)

random_number = random.randint(1, delta.days)

new_date = start_date + timedelta(days=random_number)
print (new_date)
Devang
  • 299
  • 2
  • 4
  • 14
-1

Use ApacheCommonUtils to generate a random long within a given range, and then create Date out of that long.

Example:

import org.apache.commons.math.random.RandomData;

import org.apache.commons.math.random.RandomDataImpl;

public Date nextDate(Date min, Date max) {

RandomData randomData = new RandomDataImpl();

return new Date(randomData.nextLong(min.getTime(), max.getTime()));

}

uris
  • 5,993
  • 3
  • 25
  • 24