首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中生成长度可变的随机连续日期

在Python中生成长度可变的随机连续日期
EN

Stack Overflow用户
提问于 2021-06-07 15:26:32
回答 1查看 183关注 0票数 0

我想在给定的时间范围内产生随机的连续日期。我已经看到了一些生成随机日期的方法,下面我尝试了一个函数,但是我认为有一种更紧凑的方法来实现它。任何帮助都是非常感谢的!

这个函数做了几件事:

  1. 从日期窗口中的随机起点创建连续日期。
  2. 这些连续日期的可变长度在2-5天之间。
  3. 该函数确保在给定的开始日期和结束日期之间选择连续日期。

代码在下面。是否有一种更紧凑的方法来生成这个函数?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的简单循环或列表理解来生成。

代码语言:javascript
复制
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

运行此命令:

代码语言:javascript
复制
sd = datetime.date(2021, 1, 1)
ed = datetime.date.today()
illness(sd, ed)

提供随机(在本例中为4)在给定间隔内随机设置的连续日期数:

代码语言:javascript
复制
[datetime.date(2021, 4, 26),
 datetime.date(2021, 4, 27),
 datetime.date(2021, 4, 28),
 datetime.date(2021, 4, 29)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67874455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档