Я ищу код, который представляет определение месяцев в части австралийского законодательства - Закон о толковании (1987).
Обратите внимание, что я все еще относительный новичок к Python.
Юридическое определение
Определение гласит следующее:
(1) В любом акте месяц означает период: (a) начинающийся в начале любого дня одного из календарных месяцев; а также. (b) окончание: (i) непосредственно перед началом соответствующего дня следующего календарного месяца; или. (ii) если такого дня нет - в конце следующего календарного месяца.
Мне сообщили, что это определение означает, что если начало месяца начинается с 16/07/2019, для целей а) например, соответствующий месяц не заканчивается до 11: 59: 59: et c: pm 15/08/2019 - или функционально, 16/08/2019.
Для целей б) «конец месяца» определяется аналогично в 11: 59: 59: et c: pm в соответствующий последний день месяца. Так что, если у вас есть две даты - 31/08/2019 и 30/09/2019 - соответствующий месяц не заканчивается до 11: 59: 59: et c: pm 30/09/2019 - или функционально, 01 / 10 / 2019.
Мне нужно вывести разницу между двумя датами в месяцах, чтобы отразить, что законодательство, которое я кодирую, требует разницы между двумя датами, конкретно в месяцах.
I Я пытаюсь сделать это с объектами datetime или datetime64, если это возможно, чтобы избежать ненужного преобразования между переменными.
То, что я пробовал до сих пор.
I ' Мы использовали приведенный ниже код, чтобы найти разницу между двумя датами в месяцах, используя относительную дельту:
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-15', '%Y-%m-%d')
date2 = datetime.strptime('2020-02-05', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
print(r)
Мой ожидаемый результат для этого составляет 5 месяцев, так как есть пять полных месяцев, а затем доля месяца, которая не завершено по дате2. Это возвращает ожидаемый результат и копирует функциональность а) в законодательстве.
Однако, когда я пытаюсь повторить б) с кодом ниже:
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-31', '%Y-%m-%d')
date2 = datetime.strptime('2019-11-30', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
print(r)
Это возвращает результат 4 месяцев. Поскольку 2019-11-30 не является концом соответствующего календарного месяца, это неверно - я должен получить результат за 3 месяца для этого кода, так как месяц не завершен до 11: 59: 59: et c ,
Ожидаемые результаты
Ниже приведены четыре контрольных примера, которые я использовал для проверки результатов этого кода.
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-25', '%Y-%m-%d')
date2 = datetime.strptime('2019-09-10', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 0
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-25', '%Y-%m-%d')
date2 = datetime.strptime('2019-09-25', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 1
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-31', '%Y-%m-%d')
date2 = datetime.strptime('2019-11-30', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 3
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-31', '%Y-%m-%d')
date2 = datetime.strptime('2019-12-01', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 4
РЕДАКТИРОВАТЬ: I Вы написали входные данные для вторых двух тестовых случаев и после рассмотрения ответа Алена Т. пересмотрели ниже.
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-01', '%Y-%m-%d')
date2 = datetime.strptime('2019-11-30', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 3
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-01', '%Y-%m-%d')
date2 = datetime.strptime('2019-12-01', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 4
from datetime import datetime
from dateutil import relativedelta
date1 = datetime.strptime('2019-08-31', '%Y-%m-%d')
date2 = datetime.strptime('2019-12-01', '%Y-%m-%d')
r = relativedelta.relativedelta(date2, date1)
r.months + (12*r.years)
r.months = 3