加减日期 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)
我的 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)