Python datetime模块.days属性作用及.seconds返回0的疑问
作为Python新手,我编写了计算两个日期(示例:2023-03-15和2022-11-09)之间周数的程序,结果正确,但有两个疑问:
疑问1:为何计算日期差时需要.days属性?
当两个datetime对象相减时,得到的是一个**timedelta对象**——这是Python专门用来表示时间差的对象,它内部封装了天数、秒数、微秒数等多个时间差维度的信息。直接使用这个对象的话,输出的是完整的时间差描述,比如18 days, 0:00:00,没办法直接用来做整除7的数值运算。
而.days是timedelta对象的属性,作用是提取时间差中的天数数值(返回整数),这样我们才能用这个整数去计算周数。
关于文档说明:在Python官方datetime模块的timedelta类文档中,明确列出了.days、.seconds等属性的定义和用途,你可以在Python官方文档的datetime章节找到这部分内容。
附相关代码及输出:
#Find the number of weeks between two given dates from datetime import datetime #User input for 1st date in YYYY-MM-DD format date1 = input("Enter 1st date in YYYY-MM-DD format: ") date1 = datetime.strptime(date1, "%Y-%m-%d") #User input for 2nd date in YYYY-MM-DD format date2 = input("Enter 2nd date in YYYY-MM-DD format: ") date2 = datetime.strptime(date2, "%Y-%m-%d") #Calculate the weeks between the 2 given dates days = abs(date2-date1).days weeks = days//7 print("Number of weeks: ", weeks)
正确输出(含.days):
Enter 1st date in YYYY-MM-DD format: 2023-03-15 Enter 2nd date in YYYY-MM-DD format: 2022-11-09 Number of weeks: 18
移除.days的输出:
Enter 1st date in YYYY-MM-DD format: 2023-03-15 Enter 2nd date in YYYY-MM-DD format: 2022-11-09 Number of weeks: 18 days, 0:00:00
疑问2:将.days替换为.seconds时返回0,是否日期差仅统计天数,不包含秒数?
不是日期差不包含秒数,而是你的场景里两个datetime对象的时间部分都是00:00:00——因为你用strptime("%Y-%m-%d")解析日期时,时间会默认填充为0点整,所以两个时间点的时间差在一天范围内的秒数就是0。
另外要注意:timedelta的.seconds属性只存储一天以内的秒数,所有超过一天的时间差都会被归类到.days属性里。比如如果两个时间差是1天2小时,.days会是1,.seconds会是7200(2小时对应的秒数),而不是总秒数。如果要获取时间差的总秒数,应该使用total_seconds()方法。
替换为.seconds的输出:
Enter 1st date in YYYY-MM-DD format: 2023-03-15 Enter 2nd date in YYYY-MM-DD format: 2022-11-09 Number of weeks: 0
内容的提问来源于stack exchange,提问作者Volsie711

