在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,'%')