对于具有多个日期的特定用户,我想计算两个日期之间的总天数。这里的问题是特定用户以随机间隔有大约5个日期,我想为用户计算频率。对于两个日期,我知道如何计算,但不知道日期的数量。
数据看起来像:
[datetime.date(2016, 1, 1) datetime.date(2016, 3, 25)
datetime.date(2016, 4, 15)]
我希望计算日期之间的差距总数。
提前致谢!
答案 0 :(得分:2)
假设您需要列表中日期之间的差异。您可以遍历列表并使用enumerate
import datetime
l = [datetime.date(2016, 1, 1), datetime.date(2016, 3, 25), datetime.date(2016, 4, 15)]
leng = len(l)
res = 0
for i,v in enumerate(l):
if i+1 == leng:
break
else:
res += (l[i+1] - v).days
print(res)
<强>输出:强>
105
答案 1 :(得分:1)
鉴于您需要第一个和最后一个日期之间的差异(列表不需要排序),您可以这样做:
from datetime import date
days = [date(2016, 1, 1), date(2016, 3, 25), date(2016, 4, 15)]
print (max(days) - min(days)).days #Prints 105
由于中间有多少个日期无关紧要,因此结果与(days[2] - days[1]) + (days[1] - days[0])
相同。如您所见,days[1]
取消,结果只是排序列表中的days[2] - days[0]
。
鉴于日期列表已排序,您可以使用pairwise recipe使用itertools.tee
来创建一个生成器,该生成器会为您获取所有差异,然后从结果中获取以天为单位的算术平均值。 / p>
from datetime import date
from itertools import tee
days = [date(2016, 1, 1), date(2016, 3, 25), date(2016, 4, 15)]
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def mean(numbers):
numbers = list(numbers)
return float(sum(num.days for num in numbers)) / max(len(numbers), 1)
pairs = pairwise(days) # Returns [(datetime.date(2016, 1, 1), datetime.date(2016, 3, 25)), (datetime.date(2016, 3, 25), datetime.date(2016, 4, 15))]
diff = list(b - a for a, b in pairs) # Returns [datetime.timedelta(84), datetime.timedelta(21)]
print mean(diff) # Returns 52.5