Generar una fecha aleatoria entre otras dos fechas

Resuelto quilby asked hace 15 años • 31 respuestas

¿Cómo generaría una fecha aleatoria que debe estar entre otras dos fechas determinadas?

La firma de la función debería ser algo como esto:

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

y devolvería una fecha como:2/4/2008 7:20 PM

quilby avatar Feb 16 '09 20:02 quilby
Aceptado

Convierta ambas cadenas en marcas de tiempo (en la resolución elegida, por ejemplo, milisegundos, segundos, horas, días, lo que sea), reste el primero del último, multiplique su número aleatorio (suponiendo que esté distribuido en range [0, 1]) con esa diferencia y sume nuevamente a el anterior. Convierta la marca de tiempo nuevamente a una cadena de fecha y tendrá una hora aleatoria en ese rango.

Ejemplo de Python (la salida está casi en el formato que usted especificó, aparte del 0relleno; culpe a las convenciones de formato de hora estadounidenses):

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()))
Tom Alsberg avatar Feb 16 '2009 13:02 Tom Alsberg
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)

La precisión es de segundos. Puede aumentar la precisión hasta microsegundos o disminuirla hasta, digamos, medias horas, si lo desea. Para eso simplemente cambie el cálculo de la última línea.

ejecución de ejemplo:

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))

producción:

2008-12-04 01:50:17
nosklo avatar Feb 16 '2009 14:02 nosklo