生成特定月份和年份的随机日期

时间:2017-08-23 07:42:29

标签: python python-datetime

我有一份日期清单。对于这些日期中的每一个,保持月份和年份相同,我需要生成一个随机日期。我尝试使用此代码:

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让我知道我可以提供哪些其他细节,以免得到这个标记重复。

2 个答案:

答案 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)