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

Python 获取上个月的第一天-月份必须在1..12,python,python-3.x,datetime,datetime-format,python-datetime,Python,Python 3.x,Datetime,Datetime Format,Python Datetime,我尝试了此操作,但出现错误月份必须在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) 我可以编写一些样板代码来解决这个问题,但我正在寻找一种有效的方法,如果月-1或-2或-3或-4则应分别替换为12或11或10

我尝试了此操作,但出现错误
月份必须在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)
我可以编写一些样板代码来解决这个问题,但我正在寻找一种有效的方法,如果
-1
-2
-3
-4
则应分别替换为
12
11
10
9

请帮忙

编辑


感谢您对本月的帮助,如何处理年度部分,因为它也将从
2020
更改为
2019
?请帮助

模数运算符是您在此处的最佳选择。它正是你所需要的。您需要减去5而不是4,因为数字需要变成负数,代码才能工作:

previous\u month\u 4\u start\u date=today\u date.replace(month=(today\u date.month-5)%12+1,day=1)
#报税表:12
您可以使用
模运算来解决此问题,但首先必须将
月数
转换为有效的模12值(即
0-11
)。然后,您可以从该值中减去
n
months,取模数并通过再次加1将其转换回
month
数字:

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)
输出(截至2014年4月2020日)

这并不涉及年份发生变化的事实,要做到这一点,您需要将当前月份与被减去的数字进行比较,如果它大于当前月份,还需要从年份中减去一个:

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)
但是

这是很难做到的。简单的解决方案是将
天设置为
1
,然后使用
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)
输出:

2019-12-01
2019-12-01

如果你加8,模12,然后再加1?@TomRobinson模在值为12时会成为一个问题,因为12模12=0加1在末尾Python用模运算符正确处理负数。不需要加8,你可以减去4,得到相同的答案。谢谢,我不知道。编辑我的答案。我想他预期的答案是十二月而不是一月。所以我认为+1不是正确的解决方案。注意他说的
#错误-月份值在这里变成-1而不是12
@user12758604我很确定我的代码返回12月,你得到不同的结果了吗?@TomRobinson我得到的是01/01/2020为什么你必须减去1?@TomRobinson因为
1-12
不是模12算术的有效数字范围。您必须首先通过减去
1
(使其
0-11
)将其转换为有效范围,然后您可以执行模运算,然后通过再次添加
1
将其转换回
1-12
范围。啊。OP在他们的帖子中说,月份值变为负值,但显然变成了0。我的坏朋友。@Nick如何处理年度部分?年份也将从
2020
变为
2019
正确吗?请help@user182944是的,如果我意识到你想要达到的目标,我会从一开始就提出建议。我被另一个使用模运算的答案弄得心烦意乱。
2019-12-01
#Try this to get the previous month's first day    

from datetime import datetime,date
today_date = date.today()
if today_date.month == 1:
    previous_month_4_start_date = today_date.replace(month=(12), day=1)
else:
    previous_month_4_start_date = today_date.replace(month=(today_date.month-1), day=1)
day_name= ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday']
print(day_name[previous_month_4_start_date.weekday()])
print(previous_month_4_start_date)