我正在尝试计算通用视图中的timedelta,但我不明白如何通过元组进行并进行我正在寻找的计算。
我正在运行的查询是
sla_list = self.object_list.filter(types__name="Unplanned").filter(service__sla=True).values_list('service__name', 'end_out', 'start_out')
返回的一个例子是。
(u'Peoplesoft', datetime.datetime(2012, 7, 12, 1, 57, tzinfo=(UTC)), datetime.datetime(2012, 7, 11, 19, 25, tzinfo=(UTC)))
我在模型方法中进行了计算并且它正在工作,但我想在timedelta上进行计算,但我应该将其移动到View中。
我使用的模型方法是
timedelta = self.end_out - self.start_out
timedelta = timedelta.total_seconds()
timedelta = time.strftime('%H:%M', time.gmtime(timedelta))
任何想法都会很棒。感谢。
答案 0 :(得分:0)
sla_list
包含您要求的3个值,因此sla_list[1]
是end_out值,而start_out
是sla_list[2]
。
只需将计算应用于这两个值:
timedelta = sla_list[1] - sla_list[2]
timedelta = '%02d:%02d' % divmod(timedelta.total_seconds(), 60)
我使用divmod()
function更简单的方法替换了您的time.gmtime(timedelta)
和strftime
舞蹈;所有你需要做的就是将总秒数转换为小时(秒除以60)和剩余秒(以模60为单位),毕竟。
如果您需要对每个service__name
条目的timedeltas求和,请按该条目排序并使用itertools.groupby
callable快速有效地计算您的总和:
from itertools import groupby
from operator import itemgetter
sla_list = self.object_list.filter(types__name="Unplanned").filter(service__sla=True).order_by('service__name').values_list('service__name', 'end_out', 'start_out')
sla_deltas = {}
for name, entries in groupby(sla_list, itemgetter(0)):
sla_deltas[name] = sum(end - start for name, end, start in entries)
groupby
函数为您提供了匹配sla__name
值的子列表,我们只需为每个条目计算datetime.timedelta
,然后使用sum()
计算总时间值。< / p>