加减日期 Python

Add and Subtract Dates Python

我的 python 中只有 datetime、timedelta 和 date 模块。不幸的是,我将无法使用 relativedelta 简单地简单地添加月份和年份。

我需要一些关于将月份和年份添加到日期的建议。一直在尝试,但想不出更好的方法来考虑那些超过 30 天的闰年。

30days = Date.today() + timedelta(days=30)
Dformat = 30days.strftime(“%Y-%m-%d”)

鉴于我只有这些有限的模块,谁能以更好的方式添加不同的月份和年份?

有很多不同的可能性。我给你一个例子,它取一个日期和 return 季度的最后一天,但显然你可以将这种方法应用于任何频率,所以:

如果你有日期时间,你可以将对象 dt 定义为 datetime.date

您可以构建一个函数 get_quarter_end,它将 datetime.date 对象和 return 季度的最后一天作为输入。

def get_quarter_end(dt):
    # dt: datetime.date
    # firts we get the year of the next quarter
    nextQtYr = dt.year + (1 if dt.month > 9 else 0)
    # then the month
    nextQtFirstMo = (dt.month - 1) // 3 * 3 + 4
    nextQtFirstMo = 1 if nextQtFirstMo == 13 else nextQtFirstMo
    # finally the day (first day of the next quarter)
    nextQtFirstDy = date(nextQtYr, nextQtFirstMo, 1)
    # so we have all information about the next quarter, because we are  
    # interested by the date at the end of the quarter, we just need to 
    # substract 1 day: 
    return nextQtFirstDy - timedelta(days=1)

我不知道内置的方法。但是可以很容易地手工完成:

def add_year(dt, years):
    """
    Add years years to dt and return the new value.

    dt can be a date or datetime, years must be an integer value (may be negative)
    """
    try:
        return dt.replace(year=dt.year + years)
    except ValueError:
        # the day that does not exist in new month: return last day of month
        return dt.replace(year=dt.year + years, month=dt.month + 1, day=1
              ) - timedelta(days=1)

def add_month(dt, months):
    """
    Add months months to dt and return the new value.

    dt can be a date or datetime, months must be an integer value (may be negative)
    """
    y, m = divmod(months + dt.month, 12)
    try:
        return dt.replace(year=dt.year + y, month=m)
    except ValueError:
        # the day that does not exist in new month: return last day of month
        return dt.replace(year=dt.year + y, month=m + 1, day=1
                          ) - timedelta(days=1)

演示:

>>> d = date(2020, 12, 10)
>>> add_month(d, 3)
datetime.date(2021, 3, 10)
>>> add_month(d, -13)
datetime.date(2019, 11, 10)

它甚至可以处理更短的月份:

>>> d =date(2017,1,30)
>>> add_month(d, 1)
datetime.date(2017, 2, 28)