获取上个月的第一天 - 月份必须在 1..12 内

use*_*944 1 python datetime datetime-format python-3.x python-datetime

我尝试了这个,但收到错误month must be in 1..12

today_date = date.today()
# ERROR - month value becomes -1 here instead of 12
previous_month_4_start_date = today_date.replace(month=today_date.month - 4, day=1)
Run Code Online (Sandbox Code Playgroud)

我可以编写一些样板代码来解决这个问题,但寻找一种有效的方法,其中 ifmonth-1or-2-3or -4then 应该分别替换为12or1110or 9

请帮忙

编辑

感谢您帮助处理月份,如何处理年份部分,因为它也会从2020变为2019?请帮忙

Nic*_*ick 5

可以使用modulo算术来解决此问题,但首先您必须通过减去 1将month数字转换为有效模 12(即 )的值。0-11然后,您可以从该值中减去n月份,取模并month再次加 1 将其转换回数字:

today_date = date.today()

previous_month_4_start_date = today_date.replace(month=(today_date.month - 1 - 4) % 12 + 1, day=1)
print(previous_month_4_start_date)
Run Code Online (Sandbox Code Playgroud)

输出(截至2020-04-14):

2020-12-01
Run Code Online (Sandbox Code Playgroud)

这并没有处理年份变化的事实,为此,您需要将当前月份与被减去的数字进行比较,如果它大于当前月份,还要从年份中减去一:

previous_month_4_start_date = today_date.replace(year=today_date.year-1 if today_date.month <= 4 else today_date.year,
                                                 month=(today_date.month - 1 - 4) % 12 + 1, 
                                                 day=1)
Run Code Online (Sandbox Code Playgroud)

输出:

2019-12-01
Run Code Online (Sandbox Code Playgroud)

这是很难做到的方法。简单的解决方案是将 设为day1然后使用relativedelta减去 4 个月:

from datetime import date
from dateutil.relativedelta import relativedelta

today_date = date.today()

previous_month_4_start_date = today_date.replace(day = 1) - relativedelta(months = 4)
print(previous_month_4_start_date)
Run Code Online (Sandbox Code Playgroud)

输出:

2019-12-01
Run Code Online (Sandbox Code Playgroud)