如何根据特定条件增加日期(月份和年份)并将日期设置为默认值?
How to increment date (month and year) and set the day to default based on specific conditions?
我的日期应该总是在输入日期之后的 8 号或 22 号。
例如:
如果输入日期是 20190415 那么输出日期应该是 20190422 因为这是最近的日期,如果输入日期是 20190424 那么输出日期应该是20190508。
示例 1:
input_date = 20190415
预期 output_date = 20190422
示例 2:
input_date = 20190424
预期 output_date = 20190508
示例 3:
input_date = 20190506
预期 output_date = 20190508
示例 4:
input_date = 20191223
预期 output_date = 20200108
我们如何使用 Python 实现这一点?
您可以检查日期是否大于 22,如果大于则将其设置为下个月的 8 号。如果它在 8 到 22 之间,则将其设置为同月的 22 日,如果它低于 8 日,则将其设置为该月的 8 日。使用日期数学可能有更优雅的方法,但这适用于您的场景。
使用 datetime
模块找出 "next month" 是什么。一种方法是将 1 个月的 timedelta
添加到当前月份的第一天,然后将该 datetime
对象上的日期更改为 8 号。这是一个可能看起来像的简单示例:
from datetime import date, timedelta
input_date = date(2019, 12, 23)
if input_date.day > 22:
output_date = date(input_date.year, input_date.month) + timedelta(days=31)
output_date = output_date.replace(day = 8)
您可以阅读更多有关 datetime
模块如何在 the official documentation 上工作的详细信息。这是一篇很长的读物,但实际上我已经将该页面添加为书签,因为我总是必须返回并参考如何实际使用该模块:)
考虑到输入为字符串,可以使用timedelta计算下一个日期,查看下面的代码:
if 8<datetime.strptime(input_date, "%Y%m%d").day < 22:
delta = 22 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
elif datetime.strptime(str(input_date), "%Y%m%d").day < 8:
delta = 8 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
else:
delta = (datetime.strptime(input_date, "%Y%m%d")+ relativedelta(months=+1)).day -8
print((datetime.strptime(input_date, "%Y%m%d") + relativedelta(months=+1) -
timedelta(days=delta)).strftime("%Y%m%d") )
我的日期应该总是在输入日期之后的 8 号或 22 号。
例如:
如果输入日期是 20190415 那么输出日期应该是 20190422 因为这是最近的日期,如果输入日期是 20190424 那么输出日期应该是20190508。
示例 1:
input_date = 20190415
预期 output_date = 20190422
示例 2:
input_date = 20190424
预期 output_date = 20190508
示例 3:
input_date = 20190506
预期 output_date = 20190508
示例 4:
input_date = 20191223
预期 output_date = 20200108
我们如何使用 Python 实现这一点?
您可以检查日期是否大于 22,如果大于则将其设置为下个月的 8 号。如果它在 8 到 22 之间,则将其设置为同月的 22 日,如果它低于 8 日,则将其设置为该月的 8 日。使用日期数学可能有更优雅的方法,但这适用于您的场景。
使用 datetime
模块找出 "next month" 是什么。一种方法是将 1 个月的 timedelta
添加到当前月份的第一天,然后将该 datetime
对象上的日期更改为 8 号。这是一个可能看起来像的简单示例:
from datetime import date, timedelta
input_date = date(2019, 12, 23)
if input_date.day > 22:
output_date = date(input_date.year, input_date.month) + timedelta(days=31)
output_date = output_date.replace(day = 8)
您可以阅读更多有关 datetime
模块如何在 the official documentation 上工作的详细信息。这是一篇很长的读物,但实际上我已经将该页面添加为书签,因为我总是必须返回并参考如何实际使用该模块:)
考虑到输入为字符串,可以使用timedelta计算下一个日期,查看下面的代码:
if 8<datetime.strptime(input_date, "%Y%m%d").day < 22:
delta = 22 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
elif datetime.strptime(str(input_date), "%Y%m%d").day < 8:
delta = 8 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
else:
delta = (datetime.strptime(input_date, "%Y%m%d")+ relativedelta(months=+1)).day -8
print((datetime.strptime(input_date, "%Y%m%d") + relativedelta(months=+1) -
timedelta(days=delta)).strftime("%Y%m%d") )