微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python日期生成未生成正确的日期

如何解决Python日期生成未生成正确的日期

我是python的初学者,我制作了这个随机日期生成器,该生成器应该生成year-month-date输出。而4,6,9,11个月有30天,其他所有31天。

但是我遇到一个问题,即使if和elif的条件下M必须为2,leap年的2月仍然生成date = 30。

import random
import calendar
for i in range(500):
    Y = rand.randint(0,170)
    M = rand.randint(1,12)
    
    if calendar.isleap(G+1850) == True and M == 2:
        D = rand.randint(1,28)
    elif calendar.isleap(G+1850) == False and M == 2:
            D=rand.randint(1,29)
    if M == 4 or M == 6 or M == 9 or M == 11:
            D=rand.randint(1,30)
    else:
            D=rand.randint(1,31)

解决方法

评论中提到的几个问题:

  • 您使用的是rand而不是random
  • 您正在使用G时,应该使用Y

查看重构的代码,重写if语句以首先测试M,然后测试Y

import random
import calendar
for i in range(500):
    Y = random.randint(0,170)
    M = random.randint(1,12)
    
    if M == 2:
        if calendar.isleap(Y + 1850):
            Dmax = 28
        else:
            Dmax = 29
    elif M in [4,6,9,11]:
        Dmax = 30
    else:
        Dmax = 31
        
    D = random.randint(1,Dmax)
    
    print(Y,M,D)

一种更蟒蛇的方法是使用timedelta从原点创建一个随机日期。

import random
from datetime import datetime,timedelta

def random_date(start: datetime,end: datetime):
    days = (end - start).days
    return start + timedelta(days=random.randint(0,days))
    
    
start = datetime(1850,1,1)
end = datetime(2020,12,31)

for i in range(500):
    print(random_date(start,end))
,

如果M == 2执行最后的else块并覆盖D

简单的解决方案是将两个if部分重新排序:

import random as rand
import calendar
for i in range(500):
    G = rand.randint(0,170)
    M = rand.randint(1,12)
    
    if M == 4 or M == 6 or M == 9 or M == 11:
        D=rand.randint(1,30)
    else:
        D=rand.randint(1,31)

    if calendar.isleap(G+1850) == True and M == 2:
        D = rand.randint(1,28)
    elif calendar.isleap(G+1850) == False and M == 2:
        D=rand.randint(1,29)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。