【问题标题】:Date differences in Python in Years and Days (No Months)Python 中年日的日期差异(无月)
【发布时间】:2018-07-01 01:44:50
【问题描述】:

我有两个日期: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(difference.years)
print(difference.months)
print(difference.days)

输出是:

12
10
1

12 年 10 个月零 1 天。问题是我对几个月不感兴趣,我只想要几年和几天。在我的例子中,它应该是 12 年 306 天。我知道一个很好的近似值是 10 个月 * 30 = 300 天,但结果是 301,而不是 306。我想精确计算考虑到闰月和每个月天数差异的天数。 Python中是否有任何内置方法可以做到这一点?

我已经对 StackOverflow 进行了研究以找到答案,但与我的问题相关的所有问题都没有回答我的问题。

【问题讨论】:

    标签: python


    【解决方案1】:

    在您已经编写的代码之后,执行以下操作:

    mid_date = datetime(start_date.year + difference.years, start_date.month, start_date.day)
    print((end_date - mid_date).days)
    

    这为您的示例输入提供了 307。

    这个想法是用difference.years 抵消原来的start_date,以避免重复计算这部分差异。

    【讨论】:

    • 这是个好主意,但不是 100% 完美。我认为闰年可能会像您的情况一样改变一天或多天的结果。
    • @SalvatoreD'angelo:我认为您对本案的 306 回答与我对 307 的回答之间存在语义分歧。也就是说,你还没有明确定义这个规则。
    【解决方案2】:

    感谢 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 天的剩余时间。 谁能建议一个不那么冗长的 sn-p 代码?

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2014-04-07
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多