【问题标题】:Add and Subtract Dates Python加减日期 Python
【发布时间】:2021-03-26 06:32:10
【问题描述】:

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

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

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

鉴于我只有这些有限的模块,任何人都有办法以更好的方式添加不同的月份和年份?

【问题讨论】:

  • 那么您是否尝试将 30 days 添加到 jan 以获取 feb 的输出?

标签: python python-3.x date timedelta


【解决方案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)

【讨论】:

  • 请注意,如果初始日期是闰年的 2 月 29 日,并且您尝试添加不是 4 的倍数的年份等,这将失败 - dateutil.relativedelta 可能会提供更安全的要走的路。
  • @MrFuppes:你说得对,我对我的第一个代码不够谨慎。现在应该好多了。 BTW OP 明确声明 我将无法使用 relativedelta
  • 好吧,看来我应该更谨慎地阅读这个问题^^实际上读起来像家庭作业; “不能使用包 x”听起来像“用艰苦的方式学习一些东西”
  • 通过 relativddelta 安装设法弄清楚。但该解决方案也有效。
【解决方案2】:

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

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

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

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)

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 2015-07-17
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2014-05-15
    • 2016-12-07
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多