Generar una fecha aleatoria entre otras dos fechas
¿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
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 0
relleno; 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()))
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