Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理时间间隔的求和和和乘法?_Python_Python Dateutil_Relativedelta - Fatal编程技术网

Python 如何处理时间间隔的求和和和乘法?

Python 如何处理时间间隔的求和和和乘法?,python,python-dateutil,relativedelta,Python,Python Dateutil,Relativedelta,我需要在添加N(int)intervals(由relativedelta表示,因为它可以是月或年,也可以是秒或日期)之后计算截止日期(datetime)。我只需将interval乘以N并将其相加为start\u date(日期时间)。同时,我需要分多个步骤来完成,比如计算第5个截止日期,第6个…,所以我只需将间隔添加到开始日期中N次。 在某些情况下,这两种方法提供不同的结果 假设start\u date=datetime(年=2019,月=1,日=2),interval=relativedelt

我需要在添加
N
(int)
interval
s(由relativedelta表示,因为它可以是月或年,也可以是秒或日期)之后计算
截止日期(datetime)。我只需将
interval
乘以
N
并将其相加为
start\u date
(日期时间)。同时,我需要分多个步骤来完成,比如计算第5个截止日期,第6个…,所以我只需将
间隔
添加到
开始日期
N次。
在某些情况下,这两种方法提供不同的结果

假设
start\u date
=datetime(年=2019,月=1,日=2),
interval
=relativedelta(月=1,日=2),以及
N
=16。 从一个角度来看,这两种方法都是正确的,因为
interval*16
=relativedelta(年=+1,月=+4,天=+32),
start\u date+16*interval
=2019-01-01+1年+4个月+32天=2020/05/1+32天=2020-06-02(因为五月有31天)。 同时,当我们一个接一个地添加它们时,结果是2020/05/1+1个月+2天=2020/06/02

这个问题与“月天数溢出”有关,但我不知道如何处理它。总是使用和而不是乘法?但是calc难道不安全吗(想象一下,第999999个截止日期的间隔为1天1秒)

复制步骤:

def test_relative_sum_mult_with_date():
开始=日期时间(年=2019,月=1,日=1)
间隔=相对寿命(月=1天=2)
检查至=100
对于范围内的i(检查到):
乘以=开始+i*间隔
合计=开始
对于范围(i)中的j:
总和+=间隔
打印('i=%s,i*间隔=%s,差异(乘和)=%s,乘和=%s,求和=%s'%
(i,i*区间,乘和,乘和)
断言相乘==求和
跟踪:

i*interval=relativedelta(), diff(multiplied-summed)=0:00:00, multiplied=2019-01-01 00:00:00, summed=2019-01-01 00:00:00
i=1, i*interval=relativedelta(months=+1, days=+2), diff(multiplied-summed)=0:00:00, multiplied=2019-02-03 00:00:00, summed=2019-02-03 00:00:00
i=2, i*interval=relativedelta(months=+2, days=+4), diff(multiplied-summed)=0:00:00, multiplied=2019-03-05 00:00:00, summed=2019-03-05 00:00:00
i=3, i*interval=relativedelta(months=+3, days=+6), diff(multiplied-summed)=0:00:00, multiplied=2019-04-07 00:00:00, summed=2019-04-07 00:00:00
i=4, i*interval=relativedelta(months=+4, days=+8), diff(multiplied-summed)=0:00:00, multiplied=2019-05-09 00:00:00, summed=2019-05-09 00:00:00
i=5, i*interval=relativedelta(months=+5, days=+10), diff(multiplied-summed)=0:00:00, multiplied=2019-06-11 00:00:00, summed=2019-06-11 00:00:00
i=6, i*interval=relativedelta(months=+6, days=+12), diff(multiplied-summed)=0:00:00, multiplied=2019-07-13 00:00:00, summed=2019-07-13 00:00:00
i=7, i*interval=relativedelta(months=+7, days=+14), diff(multiplied-summed)=0:00:00, multiplied=2019-08-15 00:00:00, summed=2019-08-15 00:00:00
i=8, i*interval=relativedelta(months=+8, days=+16), diff(multiplied-summed)=0:00:00, multiplied=2019-09-17 00:00:00, summed=2019-09-17 00:00:00
i=9, i*interval=relativedelta(months=+9, days=+18), diff(multiplied-summed)=0:00:00, multiplied=2019-10-19 00:00:00, summed=2019-10-19 00:00:00
i=10, i*interval=relativedelta(months=+10, days=+20), diff(multiplied-summed)=0:00:00, multiplied=2019-11-21 00:00:00, summed=2019-11-21 00:00:00
i=11, i*interval=relativedelta(months=+11, days=+22), diff(multiplied-summed)=0:00:00, multiplied=2019-12-23 00:00:00, summed=2019-12-23 00:00:00
i=12, i*interval=relativedelta(years=+1, days=+24), diff(multiplied-summed)=0:00:00, multiplied=2020-01-25 00:00:00, summed=2020-01-25 00:00:00
i=13, i*interval=relativedelta(years=+1, months=+1, days=+26), diff(multiplied-summed)=0:00:00, multiplied=2020-02-27 00:00:00, summed=2020-02-27 00:00:00
i=14, i*interval=relativedelta(years=+1, months=+2, days=+28), diff(multiplied-summed)=0:00:00, multiplied=2020-03-29 00:00:00, summed=2020-03-29 00:00:00
i=15, i*interval=relativedelta(years=+1, months=+3, days=+30), diff(multiplied-summed)=0:00:00, multiplied=2020-05-01 00:00:00, summed=2020-05-01 00:00:00
i=16, i*interval=relativedelta(years=+1, months=+4, days=+32), diff(multiplied-summed)=-1 day, 0:00:00, multiplied=2020-06-02 00:00:00, summed=2020-06-03 00:00:00

datetime.datetime(2020, 6, 2, 0, 0, 0) != datetime.datetime(2020, 6, 3, 0, 0, 0)

Expected :datetime.datetime(2020, 6, 3, 0, 0, 0)
Actual   :datetime.datetime(2020, 6, 2, 0, 0, 0)
版本: Python 3.6
python dateutil==2.8.0

让我以一种更简单的方式来介绍您的示例:

start = datetime(year=2018, month=3, day=29)
interval = relativedelta(months=1, days=2)
d1 = start + interval * 2            # 2018-06-02
d2 = start + interval + interval     # 2018-06-03
print(d1, d2)

因此,我甚至不认为这是一个库错误:只要在心里遵循相同的计算,看看它们是否有意义。

什么是
relativedelta()
函数?@martineau它来自dateutil包,它可以按秒、天、月和年处理相对间隔。是的,这个例子要短得多),更好地突出了主要问题。