问题描述
我想在 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')]