Адаптируйте код месяцами, а не неделями
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)