【问题标题】:Python date generation not generating proper datesPython日期生成未生成正确的日期
【发布时间】:2020-12-24 05:52:07
【问题描述】:

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

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

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)

【问题讨论】:

  • 你的意思是写if calendar.isleap(Y+1850)
  • rand 定义在哪里?
  • 如果 "M == 2" 则执行最后的 else-block 并覆盖 "D"。
  • @MichaelButscher:这看起来像是对我的回答。
  • @ScottHunter 完成

标签: python date if-statement random


【解决方案1】:

cmets中提到的几个问题:

  • 您使用的是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)

更 Python 的方式是使用 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))

【讨论】:

  • 谢谢。这很有帮助。起初我尝试了生成日期的算法方式,因此我没有 100% 使用内置函数。
【解决方案2】:

如果M == 2 并覆盖D,则执行最后的else-block。

简单的解决方案是重新排序这两个 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2014-02-25
    相关资源
    最近更新 更多