генерировать случайные даты с днями и временем в python - PullRequest
0 голосов
/ 05 мая 2020

эй, ребята, я пытался создать код, который генерирует даты в заданном диапазоне, но я столкнулся с некоторыми проблемами, код выглядит следующим образом:

import datetime
import random
import os
from random import randrange
year_b = 2019 
month_b = 1
day_b = 1
year_e = 2020 
month_e = 1 
day_e = 1 

 def date_range(start, end, step: datetime.timedelta):
     while start < end:
        yield start
        start += step


rand_list=[5,8,6,9,10]


for d in date_range(
    start=datetime.datetime(year_b, month_b, day_b),
    end=datetime.datetime(year_e, month_e, day_e),
    step=datetime.timedelta(days=rand.choice(rand_list)),
    ):
    print(d)

os.system("pause")

вывод:

2019-01-01 00:00:00
2019-01-09 00:00:00
2019-01-17 00:00:00
2019-01-25 00:00:00
2019-02-02 00:00:00
Press any key to continue . . . 

сначала проблема в том, что код выбирает только одно случайное значение из списка и добавляет его к дате, но мне нужно, чтобы он выбирал случайное значение для каждой сгенерированной даты

вторая проблема заключается в том, что код время, когда оно не было сгенерировано случайным образом

какие-нибудь идеи по решению этих проблем ??? !!

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

«Случайное» часто плохо определяется. Почему бы не выбрать определенное c количество выборок равномерно из распределения?

from datetime import datetime, timedelta

def items(start, end, samples):
    total_sec = int((end - start).total_seconds())
    deltas = random.sample(range(total_sec), samples)  # xrange if py2k!
    return (start + timedelta(seconds=delta) for delta in sorted(deltas))

Тогда вы получите

samples = 10
start = datetime(2019, 1, 1)
end = datetime(2020, 1, 1)
print(list(items(start, end, samples)))

, например:

[datetime.datetime(2019, 1, 12, 16, 40, 53),
 datetime.datetime(2019, 2, 1, 1, 41, 45),
 datetime.datetime(2019, 2, 25, 10, 29, 51),
 datetime.datetime(2019, 3, 10, 10, 24, 48),
 datetime.datetime(2019, 4, 3, 12, 46, 14),
 datetime.datetime(2019, 8, 12, 18, 30, 57),
 datetime.datetime(2019, 9, 11, 3, 59, 6),
 datetime.datetime(2019, 9, 27, 3, 9, 36),
 datetime.datetime(2019, 10, 13, 14, 23, 37),
 datetime.datetime(2019, 12, 14, 12, 23, 5)]

Из этой базы вы можете легко изменить различные другие дистрибутивы, или использовать дни или микросекунды, или разрешить дублирование.

Прочитав ваш вопрос более внимательно, я не совсем уверен, что этот ответ - то, что вы ищете , но я оставлю это на случай, если это будет полезно.

0 голосов
/ 05 мая 2020

теперь отображаются не все месяцы:

  from datetime import datetime, timedelta
  import random
  samples = 10

 start = datetime(2018, 1, 1)
 end = datetime(2020, 1, 1)

 def items(start, end, samples):
     total_sec = int((end - start).total_seconds())
     deltas = random.sample(range(total_sec), samples)  # xrange if py2k!
     return (start + timedelta(seconds=delta) for delta in sorted(deltas))


 for _ in list(items(start, end, samples)):
     print(_)

вывод:

2018-02-01 18:25:48
2018-02-20 20:24:23
2018-06-07 22:03:48
2018-07-20 07:15:37
2018-08-22 07:04:06
2018-08-28 18:02:07
2018-10-09 03:40:58
2019-01-04 15:11:40
2019-03-22 12:16:58
2019-07-22 14:44:00
0 голосов
/ 05 мая 2020

Проблема в том, что randrange(10) выполняет оценку сразу после вызова. Вместо этого вы можете заставить date_range принимать callable, что возвращает"случайную" временную дельту (или переменную дельту, или что угодно).

def adjustable_date_range(start, end, random_delta_maker):
     while start < end:
        yield start
        start += random_delta_maker

И используйте его так же в своем примере, передав вызываемый объект, который делает случайную дельту времени в [0-10) дней:

for d in adjustable_date_range(
    start=datetime.datetime(year_b, month_b, day_b),
    end=datetime.datetime(year_e, month_e, day_e),
    step=lambda: datetime.timedelta(days=randrange(10)),
):
    print(d)
...