我希望构建代码,代表澳大利亚立法中月份的定义 - 解释法(1987)。
请注意,我仍然是Python的相对新手。
法律定义
定义如下:
(1) 在任何法案中,月是指一个时期:(a)从其中一个日历月的任何一天的开始开始;(b)结束:(i)在下一个日历月相应日期开始前一刻结束;或。(ii) 如果没有这样的日期,即在下一个日历月的月底。
我被告知,这个定义意味着如果一个月的开始时间从16/07/2019开始,例如,出于a)的目的,相关月份直到11:59:59:59:etc:pm在15/08/2019结束 - 或者从功能上讲,16/08/2019。
因此,出于 b) 的目的,“月末”的定义与该月相关最后一天的 11:59:59:etc:etc:pm 类似。因此,如果您有两个日期 - 31 / 08 / 2019和30 / 09 / 2019 - 相关月份直到30 / 09 / 2019的11:59:59:etc:pm为止 - 或者功能上是01 / 10 / 2019。
我需要以月为单位输出两个日期之间的差异,以反映我正在编码的立法要求两个日期之间的差异,特别是以月份为单位。
如果可能的话,我希望使用datetime或datetime64对象来执行此操作,以避免不必要地在变量之间进行转换。
到目前为止,我尝试过什么。
我使用以下代码来查找月份中两个日期之间的差异,使用相对delta:
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:etc才完成。
预期成果
下面是我用来测试此代码结果的四个测试用例。
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
幕布斯6054654
收到一只叮咚
慕村225694
相关分类