我正在寻找构建代表澳大利亚立法中月份定义的代码 - 解释法(1987)。
请注意,我仍然是 Python 的新手。
法律定义
定义如下:
(1) 在任何法案中,月份是指一个时期: (a) 从一个日历月的任何一天开始;和。(b) 结束: (i) 紧接在下一个日历月的相应日期开始之前;或者。(ii) 如果没有这样的日子——在下一个日历月的月底。
我被告知,这个定义意味着如果一个月的开始时间是 2019 年 7 月 16 日,例如,出于 a) 的目的,相关月份直到 11:59:59:etc:pm 才结束15/08/2019 - 或功能上,16/08/2019。
那么,为了 b) 的目的,“月末”定义在当月相关最后一天的 11:59:59:etc:pm。因此,如果您有两个日期 - 2019 年 8 月 31 日和 2019 年 9 月 30 日 - 相关月份直到 2019 年 9 月 30 日下午 11:59:59:etc:pm 才结束 - 或者功能上,2019 年 1 月 10 日.
我需要以月为单位输出两个日期之间的差异,以反映我正在编码的立法要求两个日期之间的差异,特别是在月内。
如果可能,我希望使用 datetime 或 datetime64 对象来执行此操作,以避免在变量之间进行不必要的转换。
到目前为止我所尝试的。
我使用以下代码使用 relativedelta 来查找月份中两个日期之间的差异:
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 个月,因为有五个完整的月份,然后还有一小部分在 date2 之前没有完成。这将返回预期结果,并在立法中复制 a) 的功能。
但是,当我尝试使用以下代码复制 b) 时:
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: 等才完成。
预期成绩
以下是我用来测试此代码结果的四个测试用例。
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
编辑:我已经为后两个测试用例编写了输入,在查看了 Alain T. 的回复后,已修改为以下内容。
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