我有一份日期清单。对于这些日期中的每一个,保持月份和年份相同,我需要生成一个随机日期。我尝试使用此代码:
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日或类似的东西。怎么避免这个?
编辑:我不需要获得随机日期黑白2日期。这是一个不同的问题。 Plz让我知道我可以提供哪些其他细节,以免得到这个标记重复。
答案 0 :(得分:0)
简而言之,请使用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])
此函数将返回datetime.date
个对象。
详细(TL; DR):
dates
是该月周的所有日期的迭代器。它包括上个月和下个月的几天。例如,list(calendar.Calendar().itermonthdates(2017, 8))
还将包括2017-07-31,2017-09-01,2017-09-02,2017-09-03。所以我使用list comprehension来过滤它们。
只有一个简写:它不能处理1582-10-04和1582-10-15之间的日期。 Ten dates were skipped to make calendar correct。这是由于python datetime
lib。
答案 1 :(得分:0)
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)