在Python中以iso 8601格式生成一个范围内的n个日期的随机列表

问题描述

我想在 2019-01-01 到 2019-12-31 n 次范围内生成一个 iso8601 格式的随机日期列表。

from datetime import date
start_date = date(2019,1,1)
end_date = date(2019,12,31)

我看过的其他线程只是提供了该范围内所有日期的列表,但这不是我需要的。我还需要日期为 iso8601 格式。实现这一目标的最佳方法是什么?

解决方法

在生成范围内所有日期的列表后,您可以使用 random.sample 进行无替换采样或使用 random.choices 进行有替换采样。

如果您不想存储列表,您还可以生成从 1 到 365 的 N 随机数,然后将它们转换为适当的日期。

import random

from datetime import date,timedelta

end_date = date(2019,12,31)
current_date = date(2019,1,1)
n = 3

step = timedelta(days=1)

dates = [current_date]
while current_date != end_date:
    current_date += step
    dates.append(current_date)

random_dates = random.choices(dates,k=n)
print([d.isoformat() for d in random_dates])
,

你可以这样做

import datetime
import random

# startdate
start_date = datetime.date(2019,1)

# enddate
end_date = datetime.date(2019,31)

time_between_dates = end_date - start_date
days_between_dates = time_between_dates.days
#workload in days

random.seed(a=None)

random_number_of_days = random.randrange(days_between_dates)
random_date = start_date + datetime.timedelta(days=random_number_of_days)
print(str(random_date))

运行结果如下

2019-06-07

这里也有人问过类似的问题 Python - Generate random dates to create Gantt sequenced tasks

除了最后一个循环外,大部分代码都来自那里

,

我创建了一个带有两个 iso8601 日期值的日期时间索引的数据框。然后我以每 30 分钟的间隔重新采样数据帧索引,然后从数据帧中随机选择 3 个项目。

df=pd.DataFrame({'timestamp':['2019-01-01T00:00:00.000Z','2019-12-31T23:59:59.300Z']})
df['timestamp']=df['timestamp'].apply(lambda timestamp: datetime.strptime(timestamp,'%Y-%m-%dT%H:%M:%S.%f%z'))
print(df['timestamp'])
df=df.set_index('timestamp')
dates = df.resample('30Min').max().dropna()
#print(dates)
random_dates = random.choices(dates.index,k=3)
print(random_dates)

输出:

[时间戳('2019-08-29 16:30:00+0000',tz='UTC',freq='30T'),时间戳('2019-11-09 03:30:00+0000',Timestamp('2019-08-02 12:00:00+0000',freq='30T')]