0

我正在尝试在通用视图中计算时间增量,但我不明白如何通过元组并进行我正在寻找的计算。

我正在运行的查询是

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 上进行的计算,我认为它应该被移到视图中。

我使用的模型方法是

timedelta = self.end_out - self.start_out
timedelta = timedelta.total_seconds()
timedelta = time.strftime('%H:%M', time.gmtime(timedelta))

任何想法都会很棒。谢谢。

4

1 回答 1

0

sla_list包含您要求的 3 个值,sla_list[1]end_out 值也是如此,而start_outis sla_list[2]

只需将您的计算应用于这两个值:

timedelta = sla_list[1] - sla_list[2]
timedelta = '%02d:%02d' % divmod(timedelta.total_seconds(), 60)

我用一个更简单的方法替换了你time.gmtime(timedelta)and dance ; 毕竟,您需要做的就是将总秒数转换为小时(秒除以 60)和剩余秒数(秒模 60)。strftimedivmod()

如果您需要对每个条目的时间增量求和,请service__name按该条目排序并使用itertools.groupby可调用函数快速有效地计算总和:

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()计算总时间增量。

于 2012-08-31T14:05:09.787 回答