【问题标题】:Python : Calculate difference between dates in monthsPython:计算月份日期之间的差异
【发布时间】:2019-12-27 15:07:00
【问题描述】:

我正在尝试使用 relativedelta 查找两个日期之间的月差。我能够找到年和日的差异,但是当我按月过滤时得到 0。有什么建议吗?

from dateutil import relativedelta as rd
import datetime as date 

dateformat = '%Y/%m/%d'
startDate  = date.strptime('2017/07/01',dateformat).date()
endDate = date.strptime('2019/10/29',dateformat).date()

date_diff = rd.relativedelta(endDate,startDate)

print(date_diff.days)

【问题讨论】:

  • 请显示您的导入,特别是在您重命名的情况下。此外,您的示例为我生成了relativedelta(years=+2, months=+3, days=+28),看起来非常好。
  • @tzaman 我的导入如下:
  • from dateutil import relativedelta as rd
  • import datetime as date
  • 谢谢,我就是这么想的。我已将它们编辑到您的问题中,以便人们可以通过复制和粘贴更轻松地运行您的代码。另外,import datetime as date 是一个非常糟糕的主意,不要那样做;因为datetime 已经包含一个名为date 的类,所以它非常混乱。

标签: python python-3.x


【解决方案1】:

解决办法如下:

from datetime import datetime

def diff_month(d1, d2):
    return (d1.year - d2.year) * 12 + d1.month - d2.month

assert diff_month(datetime(2010,10,1), datetime(2010,9,1)) == 1
assert diff_month(datetime(2010,10,1), datetime(2009,10,1)) == 12

【讨论】:

  • 谢谢。为什么 relativedelta 不计算月差?
  • 我可以用我创建的变量替换值(2010,10,1),(2010,9,1)等吗?
【解决方案2】:

relativedelta 将差异显示为年、月和日。如果这是您要查找的内容,它不会显示净月数。如果两个日期碰巧在不同年份的同一个月,months 属性将为零。

如果您想显示总月数,您可以编写一个小函数,通过添加年值来为您执行此操作。

from datetime import datetime
from dateutil.relativedelta import relativedelta

def month_delta(start_date, end_date):
    delta = relativedelta(end_date, start_date)
    # >>> relativedelta(years=+2, months=+3, days=+28)
    return 12 * delta.years + delta.months

d1 = datetime(2017, 7, 1)
d2 = datetime(2019, 10, 29)
total_months = month_delta(d1, d2)
print(total_months)
# >>> 27

【讨论】:

    【解决方案3】:

    end-start 将生成 timedelta 对象,其中 days 属性将给出所需的天数差异

    >>> from datetime import date
    >>> start = date(2017,7,1)
    >>> end = date(2017,11,11)
    >>> (end-start).days
    133
    

    【讨论】:

    • 谢谢。我以为 timedelta 只支持天和周?
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多