在特定的月份和年份生成随机日期
Generate random date in a particular month and year
我有一个日期列表。对于这些日期中的每一个,保持月份和年份相同,我需要生成一个随机日期。我尝试使用此代码:
def get_random_date(date):
r_int = random.randint(1, 28) #line 2
rand_date = date[0:4] + date[5:7] + str(r_int)
randm_date = datetime.datetime.strptime(rand_date, '%Y%m%d').date()
return randm_date
但在这段代码中,我永远不会得到 29、30 或 31。如果我删除第 2 行中的 28,我可能会得到 2 月 30 日或类似的数字。如何避免这种情况?
编辑:我不需要获取随机日期 b/w 2 个日期。这是一个不同的问题。请让我知道我可以提供哪些其他详细信息来避免这个标记为重复。
简而言之,使用calendar
lib:
import calendar, random
def randomdate(year, month):
dates = calendar.Calendar().itermonthdates(year, month)
return random.choice([date for date in dates if date.month == month])
此函数将 return 一个 datetime.date
对象。
详细 (TL;DR):
dates
是该月几周内所有日期的迭代器。它包括上个月和下个月的几天。例如,list(calendar.Calendar().itermonthdates(2017, 8))
还将包括 2017-07-31、2017-09-01、2017-09-02、2017-09-03。所以我使用列表理解来过滤掉它们。
只有一种简写方式:无法处理 1582-10-04 和 1582-10-15 之间的日期。 Ten dates were skipped to make calendar correct。这是由于 python datetime
库。
from datetime import timedelta
from random import randrange
import calendar
def rnd_date(date):
mrange = calendar.monthrange(date.year,date.month)
d2 = date.replace(day=mrange[1])
d1 = date.replace(day=mrange[0])
delta = d2 - d1
result_int = delta.total_seconds()
rnd = randrange(result_int)
return d1 + timedelta(seconds=rnd)
示例:
date = datetime.strptime('2/28/2020 1:30 PM', '%m/%d/%Y %I:%M %p')
rnd_date(date)
datetime.datetime(2020, 2, 10, 20, 37, 14)
day=0
rndate=None
while day != 29:
rndate = rnd_date(date)
day = rndate.day
day
29
rndate
datetime.datetime(2020, 2, 29, 9, 4, 41)
我有一个日期列表。对于这些日期中的每一个,保持月份和年份相同,我需要生成一个随机日期。我尝试使用此代码:
def get_random_date(date):
r_int = random.randint(1, 28) #line 2
rand_date = date[0:4] + date[5:7] + str(r_int)
randm_date = datetime.datetime.strptime(rand_date, '%Y%m%d').date()
return randm_date
但在这段代码中,我永远不会得到 29、30 或 31。如果我删除第 2 行中的 28,我可能会得到 2 月 30 日或类似的数字。如何避免这种情况?
编辑:我不需要获取随机日期 b/w 2 个日期。这是一个不同的问题。请让我知道我可以提供哪些其他详细信息来避免这个标记为重复。
简而言之,使用calendar
lib:
import calendar, random
def randomdate(year, month):
dates = calendar.Calendar().itermonthdates(year, month)
return random.choice([date for date in dates if date.month == month])
此函数将 return 一个 datetime.date
对象。
详细 (TL;DR):
dates
是该月几周内所有日期的迭代器。它包括上个月和下个月的几天。例如,list(calendar.Calendar().itermonthdates(2017, 8))
还将包括 2017-07-31、2017-09-01、2017-09-02、2017-09-03。所以我使用列表理解来过滤掉它们。
只有一种简写方式:无法处理 1582-10-04 和 1582-10-15 之间的日期。 Ten dates were skipped to make calendar correct。这是由于 python datetime
库。
from datetime import timedelta
from random import randrange
import calendar
def rnd_date(date):
mrange = calendar.monthrange(date.year,date.month)
d2 = date.replace(day=mrange[1])
d1 = date.replace(day=mrange[0])
delta = d2 - d1
result_int = delta.total_seconds()
rnd = randrange(result_int)
return d1 + timedelta(seconds=rnd)
示例:
date = datetime.strptime('2/28/2020 1:30 PM', '%m/%d/%Y %I:%M %p')
rnd_date(date)
datetime.datetime(2020, 2, 10, 20, 37, 14)
day=0
rndate=None
while day != 29:
rndate = rnd_date(date)
day = rndate.day
day
29
rndate
datetime.datetime(2020, 2, 29, 9, 4, 41)