我在Python3中有多个relativedelta值,我想取所有这些值的平均值。例如,对于下面的两个值,我想要一个relativedelta值,其中小时= +3天(两者之间的平均值)。
relativedelta(days=+2, hours=+1, minutes=+33, seconds=+51)
relativedelta(hours=+4, minutes=+35, seconds=+36)如何计算列表之间的平均值?如果有一种方法可以获得每个值的总小时数,我可以将它们相加并除以值的数量,然后除以24得到天数?
发布于 2018-01-26 06:04:15
在dateutil中无法直接做到这一点。相反,您可以将两者都锚定到datetime,并在锚定的日期之间找到一个timedelta。下面的数字以天为单位,源于一天中有86,400秒:
from dateutil.relativedelta import relativedelta
from datetime import datetime
from statistics import mean
def avg_relativedelta(*relativedeltas):
dates = (anchor - rd for rd in relativedeltas)
tds = (anchor - date for date in dates)
return mean(td.total_seconds() for td in tds) / 86400
i1 = relativedelta(days=2, hours=1, minutes=33, seconds=51)
i2 = relativedelta(hours=4, minutes=35, seconds=36)
i3 = relativedelta(days=6, minutes=10)
avg_relativedelta(i1, i2, i3)
# 2.7545023148148147
avg_relativedelta(i1, i2)
# 1.12828125您需要从datetime中减去relativedelta,然后从相同的datetime中减去此datetime,这有点不直观。但从根本上说,这是一种将relativedelta转换为timedelta的方法,后者能够聚合其单元。
或者:
def total_days_in_relativedelta(reldelta):
total_days = reldelta.years * 365 \
+ reldelta.months * 12 \
+ reldelta.weeks * 52 \
+ reldelta.days \
+ reldelta.minutes * 1440 \
+ reldelta.seconds * 86400 \
+ reldelta.microseconds * 1000000
return total_days
def avg_relativedelta(*relativedeltas):
return mean(total_days_in_relativedelta(rd) for rd in relativedeltas)https://stackoverflow.com/questions/48452449
复制相似问题