在Python中生成带有日期和时间的随机日期

时间:2020-05-04 23:47:52

标签: python datetime random

伙计们,我正在尝试创建一个代码,以生成给定范围内的日期,但是我遇到了一些问题 代码如下:

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 :(得分:0)

问题是因为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)

答案 1 :(得分:0)

“随机”通常定义不清。为什么不从分布中均匀选择特定数量的样本?

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

在此基础上,您可以轻松地修改为其他各种分布,或者使用天或微秒,或者允许重复。

在仔细阅读了您的问题之后,我并不完全相信这个答案就是您要寻找的东西,但是如果有帮助,我会保留。

答案 2 :(得分:0)

现在并非所有月份都显示:

  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