Python中的日期差异,以年和日为单位(无月)
我有两个日期:2005/04/10和2018/02/11 以下代码以年、月和日为单位计算差异:Python中的日期差异,以年和日为单位(无月),python,Python,我有两个日期:2005/04/10和2018/02/11 以下代码以年、月和日为单位计算差异: from datetime import datetime from dateutil.relativedelta import relativedelta start_date = datetime(2005,4,10) end_date = datetime(2018,2,11) difference = relativedelta(end_date, start_date) print(diff
from datetime import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime(2005,4,10)
end_date = datetime(2018,2,11)
difference = relativedelta(end_date, start_date)
print(difference.years)
print(difference.months)
print(difference.days)
输出为:
12
10
1
12年10个月零1天。问题是我对几个月不感兴趣,我只想要几年和几天。在我的例子中,应该是12年零306天。我知道一个好的近似值是10个月*30=300天,但结果是301,而不是306。我想精确计算闰月的天数,以及每个月天数的差异。Python中是否有内置的方法来实现这一点
听着,我已经对StackOverflow进行了研究,以找到答案,但所有与我的问题相关的答案都不能回答我的问题。在您已经编写的代码之后,请执行以下操作:
mid_date = datetime(start_date.year + difference.years, start_date.month, start_date.day)
print((end_date - mid_date).days)
这为您的示例输入提供了307
我们的想法是用
差异来抵消原始的开始日期
。年份
,以避免重复计算该部分差异。在编写代码后,执行以下操作:
mid_date = datetime(start_date.year + difference.years, start_date.month, start_date.day)
print((end_date - mid_date).days)
这为您的示例输入提供了307
我们的想法是通过
差异来抵消原始的开始日期
。年
,以避免重复计算差异的那部分。感谢John的评论,我编写了这段代码,我认为它满足了我的要求:
from datetime import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime(2005,4,10)
end_date = datetime(2018,2,11)
difference = relativedelta(end_date, start_date)
remaining_days = 0
if start_date != datetime(start_date.year, 1, 1):
end_first_year = datetime(start_date.year, 12, 31)
remaining_days += (end_first_year - start_date).days
if end_date != datetime(start_date.year, 1, 1):
begin_last_year = datetime(end_date.year, 1, 1)
remaining_days += (end_date - begin_last_year).days
print(difference.years)
print(remaining_days)
这正好是剩下的306天。
有人能推荐一段不那么冗长的代码吗?多亏了John的评论,我写了这段代码,我认为它满足了我的要求:
from datetime import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime(2005,4,10)
end_date = datetime(2018,2,11)
difference = relativedelta(end_date, start_date)
remaining_days = 0
if start_date != datetime(start_date.year, 1, 1):
end_first_year = datetime(start_date.year, 12, 31)
remaining_days += (end_first_year - start_date).days
if end_date != datetime(start_date.year, 1, 1):
begin_last_year = datetime(end_date.year, 1, 1)
remaining_days += (end_date - begin_last_year).days
print(difference.years)
print(remaining_days)
这正好是剩下的306天。
有人能推荐一段不那么冗长的代码吗?这是个好主意,但不是100%完美。我认为闰年可能会像你的情况那样改变一天或几天的结果。@SalvatoreD'angelo:我认为你对这个案例的答案306与我的答案307之间的分歧是语义上的。也就是说,您还没有明确定义这方面的规则。这是一个好主意,但并非100%完美。我认为闰年可能会像你的情况那样改变一天或几天的结果。@SalvatoreD'angelo:我认为你对这个案例的答案306与我的答案307之间的分歧是语义上的。也就是说,您还没有明确定义这方面的规则。