Адаптируйте код месяцами, а не неделями

        start_week = start_date - datetime.timedelta(7)
        end_week = start_week + datetime.timedelta(7)

            while start_week < end_week:
                array = np.array([])
                count = CustomerProfile.objects.filter(user__date_joined__range=[start_week, end_week])
                array = np.append(array, count)
                start_week = end_week + datetime.timedelta(1)
                end_end = start_week + datetime.timedelta(7)

Этот код работает удивительно, потому что мы учитываем дату начала и дату окончания недели. Неделя всегда будет иметь 7 дней, а количество дней в месяце и в году варьируется. Как мы могли бы адаптировать этот код так, чтобы он работал эффективно с месяцами и годами, а не с неделями?

1 ответ

Вы можете просто получить текущий месяц от сегодняшней даты. При этом вы можете определить количество дней, чтобы сложить / вычесть.

Пример:

today = datetime.datetime.today()
current_year = today.year
current_month = today.month
daysdiff = 0
if current_month in [1, 3, 5, 7, 8, 10, 12]:
    daysdiff = 31
elif current_month == 2:
    # check if leap year
    if current_year % 4 == 0:
        if current_year % 100 == 0:
            if current_year % 400 == 0:
                daysdiff = 29
            else:
                daysdiff = 28
        else:
            daysdiff = 28
    else:
        daysdiff = 28
else:
    daysdiff = 30

Затем вы можете использовать переменную daysdiff использовать в дальнейших расчетах.

В качестве примечания вы можете использовать модуль dateutil, который имеет relativedelta метод, который принимает месяцы в качестве аргумента для расчета на основе текущего месяца.

Пример:

from dateutil.relativedelta import relativedelta

# as an example, lets go back one month from `now`
prev_month_date = datetime.datetime.now() - relativedelta(months=1)
Другие вопросы по тегам