Получить первый день предыдущего месяца - месяц должен быть в 1..12 - PullRequest
0 голосов
/ 14 апреля 2020

Я попробовал это, и я получаю ошибку 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)

Я могу написать некоторый шаблонный код, чтобы исправить это, но ищу эффективный подход, где, если month равно -1 или -2 или -3 или -4, тогда его следует заменить на 12 или 11 или 10 или 9 соответственно.

Пожалуйста, помогите

EDIT

Спасибо за помощь с месяцем, как позаботиться о части года, так как она также изменится с 2020 на 2019? Пожалуйста, помогите

Ответы [ 3 ]

4 голосов
/ 14 апреля 2020

Вы можете использовать modulo арифметику c для этой задачи, но сначала вам нужно преобразовать число 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)

Вывод (по состоянию на 2020-04-14):

2020-12-01

Это не связано с тем, что год меняется, для этого необходимо сравнить текущий месяц с вычитаемым числом, а если он больше текущего месяца, также вычесть один из год:

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)

Вывод:

2019-12-01

Но

Это трудный способ сделать это. Простое решение - установить day на 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
2 голосов
/ 14 апреля 2020

Оператор модуля является вашей лучшей ставкой здесь. Это именно то, что вам нужно. Вам нужно вычесть 5 вместо 4, потому что число должно переходить в отрицательные значения, чтобы код работал:

previous_month_4_start_date = today_date.replace(month=(today_date.month - 5) % 12 + 1, day=1)
# Returns: 12
0 голосов
/ 14 апреля 2020
#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)
...