Python学习(内置日期函数 )——timedelta()应用案例

本文详细介绍了Python中的timedelta类,如何表示和操作时间差,包括表示固定天数、计算日期差异、与日期结合以及在生日悖论中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Python中,内置有丰富的日期操作函数,下面是timedelta()函数详细介绍及应用。

在Python中,timedelta 是一个表示时间差的类,它属于 datetime 模块。timedelta 对象表示两个日期或时间之间的差异。

当你想要表示一段时间,比如几天、几小时或几分钟,而不是一个特定的日期或时间时,timedelta 非常有用。

下面是一些使用 timedelta 的例子:

1、表示几天的差异

from datetime import timedelta  
  
# 创建表示5天的timedelta对象  
td = timedelta(days=5)  
print(td)  # 输出:5 days, 0:00:00

2、计算两个日期之间的差异

from datetime import date  
  
d1 = date(2023, 7, 1)  
d2 = date(2023, 7, 10)  
delta = d2 - d1  # 这会返回一个timedelta对象,表示两日期之间的天数差异  
print(delta)  # 输出:9 days, 0:00:00

3、将timedelta对象加到日期上

from datetime import date  
  
d = date(2023, 7, 1)  
d += timedelta(days=10)  # 在日期上加10天  
print(d)  # 输出:2023-07-11

4、表示时间间隔
除了表示天数,timedelta 还可以表示小时、分钟、秒等时间间隔。例如:

from datetime import timedelta  
  
# 表示1小时30分钟的时间间隔  
td = timedelta(hours=1, minutes=30)  
print(td)  # 输出:1:30:00

总的来说,timedelta 提供了一种方便的方式来表示和操作时间间隔,这在处理日期和时间时非常有用。

imedelta() 默认参数是 days=0, seconds=0, microseconds=0。这意味着如果你不提供任何参数,它会返回一个表示0天、0秒和0微秒的时间差对象。

如果 timedelta() 只有一个整数参数,那么这个参数代表天数。例如,timedelta(5) 表示5天的时间差。其他的时间单位(如小时、分钟、秒和微秒)不会被考虑在内。

下面代码使用timedeltr()函数,生成一年中的随机的日期:

# 假定2001年
# 通过datetime()获取2001年1月1日
startOfYear = datetime.date(2001,1,1)  

# 随机获取一年中一天
# random.randint(a, b)函数会返回一个介于a和b(包括a和b)之间的随机整数
# randomNumberOfDays是[1,364]之间的整数
randomNumberOfDays = datetime.timedelta(random.randint(0,364))
# 2001年期间的随机的一天
randomDay = startOfYear + randomNumberOfDays

下面代码,设计一个函数,参数是整数,根据参数n,生成n个人的随机生日。

def getRandomBirthdays(people_number):
    '''返回一个随机生日日期对象的数字列表

    :param people_number: 人员数量
    :type int
    '''
    birthdays = []
    for i in range(people_number):
        # 获取每年的第一天,年份可根据需要更改
        startOfYear = datetime.date(2001,1,1)

        # 随机获取一年中一天
        randomNumberOfDays = datetime.timedelta(random.randint(0,364))
        birthday = startOfYear + randomNumberOfDays
        birthdays.append(birthday)
    
    return birthdays

以上为学习Al Sweigart 撰写的“生日悖论”代码,附录如下:

# //
# 生日悖论
# 作者:Al Sweigart
# 生日悖论又称为“生日问题”,是指即使在很少的一群人中两人的生日相同概率也是惊人的。
# 在一个70人的组中,两人生日相同的概率高达99%
# 在一个23人的组中,两人生日相同的概率高达50%
# 下面代码用于进行多个概率实验,计算不同规模小组中生日相同的概率值
# 这类实现称为蒙特卡罗实验。在这类实验中,我们需要进行多次随机实验,以了解可能的结果。
# //

import datetime,random

def getBirthdays(people_number):
    '''返回一个随机生日日期对象的数字列表
    
    :param people_number: 人员数量
    '''
    birthdays = []
    for i in range(people_number):
        # 年份对于模拟不重要,假设所有生日在同一年
        startOfYear = datetime.date(2001,1,1)

        # 随机获取一年中一天
        randomNumberOfDays = datetime.timedelta(random.randint(0,364))
        birthday = startOfYear + randomNumberOfDays
        birthdays.append(birthday)
    
    return birthdays

def getMatch(birthdays):
    '''返回在生日列表中多次出现的日期对象'''
    if len(birthdays) == len(set(birthdays)):  # 集合set()函数可以对列表进行初重
        return None                            # 所有生日都不同,返回None
    
    # 将这个日期与其它日期进行比较
    for a,birthdayA in enumerate(birthdays):
        for b,birthdayB in enumerate(birthdays[a+1 :]):   # 列表是有序数据类型,只需前一个元素向后比较
            if birthdayA == birthdayB:
                return birthdayA                          # 返回相同的日期


if __name__ == '__main__':
    # 打印介绍信息
    print('''**********************************************************************
* <<生日悖论>> 作者:Al Sweigart 
* 生日悖论向我们表明,在一群N人中,其中两个人有相同的生日的几率大得惊人。
* 这个程序执行了一个蒙特卡洛模拟(即,重复的随机模拟)来探索这个概念。
* (这实际上并不是一个悖论,而是一个令人惊讶的结果。)
**********************************************************************
''')
    # 创建一个按照月份排序的元组
    MONTHS = ('Jan','Feb','Mar','Apr','May','Jun',
              'Jul','Aug','Sep','Oct','Nov','Dec')
   
    while True:
        print('请输入一个大于1,最大不超过100的整数数字')
        people_num_input = input('>')
        if people_num_input.isdecimal() and (1 < int(people_num_input) <=100):
            people_num = int(people_num_input)       # 组人数
            break                          # 输入了有效的人数数量,结束循环

    print()  # 打印一个空行

    # 显示生成的生日
    print('*** <',people_num,'>组,随机产生如下生日:')
    birthdays = getBirthdays(people_num)
    for i ,birthday in enumerate(birthdays):
        if i != 0:
            # 每个生日之间用逗号隔开
            print(', ',end='')
        monthName = MONTHS[birthday.month -1]
        dateText = '{} {}'.format(monthName,birthday.day)
        print(dateText,end='')

    print()
    print()

    # 确定是否存在两个相同的生日
    match = getMatch(birthdays)

    # 显示结果
    print('进行单次随机模拟测试的结果: ', end='')
    if match != None:
        monthName = MONTHS[birthday.month -1]
        dateText = '{} {}'.format(monthName,match.day)
        print('在{}这一天,有多人生日'.format(dateText))
    else:
        print('没有相同生日的人员.')

    print()
    
    # 运行100000次模拟
    print('*** 生成<',people_num,'人>组,10万次,随机测验模拟,请稍候......\n')
    simMatch = 0  # 模拟中有多少相同的生日
    for i in range(100000):
        # 每10000万次模拟后输出当前进度
        if i % 10000 == 0:
            print(i,'模拟进行中.....')
        birthdays = getBirthdays(people_num)
        if getMatch(birthdays) != None:
            simMatch += 1
    print ('100000次模拟测试结束。')

    # 打印机构
    probablility = round(simMatch / 100000 * 100 ,2)
    print('\n***10万次模拟测试结束, ', people_num, '人组,有相同生日人员的概率:',probablility,'%')
                         


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值