如何解决加减日期 Python
我的 Python 中只有 datetime、timedelta 和 date 模块。不幸的是,我无法使用relativedelta 轻松地简单地添加月份和年份。
我需要一些建议来为日期添加月份和年份。一直在尝试,但想不出更好的方法来考虑那些超过 30 天的闰年。
30days = Date.today() + timedelta(days=30)
Dformat = 30days.strftime(“%Y-%m-%d”)
鉴于我只有这些有限的模块,有人能以更好的方式添加不同的月份和年份吗?
解决方法
我不知道内置的方法。但它可以很容易地手工完成:
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,-13)
datetime.date(2019,11,10)
它甚至可以处理较短的月份:
>>> d =date(2017,1,30)
>>> add_month(d,1)
datetime.date(2017,2,28)
,
有很多不同的可能性。我给你一个例子,它获取一个日期并返回季度的最后一天,但显然你可以将此方法应用于任何频率,所以:
如果你有日期时间,你可以有一个对象 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。