我想在给定的时间范围内产生随机的连续日期。我已经看到了一些生成随机日期的方法,下面我尝试了一个函数,但是我认为有一种更紧凑的方法来实现它。任何帮助都是非常感谢的!
这个函数做了几件事:
代码在下面。是否有一种更紧凑的方法来生成这个函数?
def illness(start_date,end_date):
funct_ill_list=[] #list that will store all dates
#randomly choosing first date
diff = end_date - start_date
random_number = random.randint(0,diff.days-5)
temp = start_date + datetime.timedelta(random_number) #temp = 1 march + "random_number" days
funct_ill_list.append(temp) #adding the first date to list
#adding next 'n' (2-5) consecutive dates after our last element in list(most recently added date in list)
# ----------------FOR EXAMPLE - funct_ill_list = ['4 march','5 march','6 march']; random_number=3
while funct_ill_list[-1]<=end_date: #stop when last element in list (most recently added date in list) exceeds end_date
random_number = random.randint(2,5) #for 2-5 random days (consecutive) - get a random integer between 2 to 5
last = funct_ill_list[-1]+datetime.timedelta(random_number) #'last' variable stores maximum possible date we will have with chosen random_number
if last>end_date:
funct_ill_list.pop()
break
else: #else add next 'random_number' dates to list
ref_date = funct_ill_list[-1] #last element of list
for i in range(1,random_number): #'i' takes values from 1 to (random_number-1).
temp = ref_date + datetime.timedelta(i) #each time add 'i' days to ref_date to get new date 'temp'
funct_ill_list.append(temp) #add this new date to list.
#for next random date
# --------------FOR EXAMPLE - funct_ill_list = ['4 march','5 march','6 march','25 march']
diff = end_date - funct_ill_list[-1] #get no. of days remaining b/w end_date and last element added to list
if diff.days>=2: #if diff.days=0 or 1, ie. last element in list is either end_date or end_date-1,
#No point of adding more dates for next round (since 2-5 consecutive days won't be possible), else add.
random_number = random.randint(2,diff.days) #randomly choose a number
temp = funct_ill_list[-1] + datetime.timedelta(random_number) #adding "random_number" days to last element of list
funct_ill_list.append(temp) #adding it to list
return funct_ill_list
ill_start_date = datetime.date(2020, 2, 1)
ill_end_date = datetime.date(2020, 4, 30)
month_time_frame = [3,5] #static two months time frame (Looks at matching dates in March and May months)发布于 2021-06-07 15:46:07
如果日期不符合条件,则不需要太多的迭代和删除日期,因为这里没有太多的随机性。你只需要两个随机数:
m,这是范围[2, 5]中的一个整数。start_date-end_date间隔中,我们应该开始我们的日期序列吗?或者,我们的第一次约会应该在start_date之后几天?让我们称其为N。很容易注意到,N受给定开始结束范围内的天数(我们称之为R)和疾病持续时间(m)的限制。具体来说,我们知道N <= R - m。
一旦我们有了N,我们就知道我们想要的日期是:
start_date + N日start_date + N + 1日start_date + N + m - 1日这可以使用start_date + range(N+m) days的简单循环或列表理解来生成。
import random
import datetime
def illness(start_date, end_date):
# Duration of start-end range (R)
max_days = (end_date - start_date).days
# How many days should the illness start (m)
illness_days = random.randint(2, min(max_days, 5))
# Number of days after start_date that the first random date is on (N)
illness_start = random.randint(0, max_days - illness_days)
# Make a list of illness_days consecutive dates starting from the first illness day
illness_dates = [start_date + datetime.timedelta(days=illness_start + d) for d in range(illness_days)]
return illness_dates运行此命令:
sd = datetime.date(2021, 1, 1)
ed = datetime.date.today()
illness(sd, ed)提供随机(在本例中为4)在给定间隔内随机设置的连续日期数:
[datetime.date(2021, 4, 26),
datetime.date(2021, 4, 27),
datetime.date(2021, 4, 28),
datetime.date(2021, 4, 29)]https://stackoverflow.com/questions/67874455
复制相似问题