【问题标题】:Django - calculate average of time between created_at and done_atDjango - 计算 created_at 和 done_at 之间的平均时间
【发布时间】:2018-12-07 12:59:10
【问题描述】:

假设我在 db 中有 100 个对象,每个对象都有 created_atdone_at 时间。我想计算所有对象的平均持续时间。有这样的想法:首先计算所有对象的持续时间,然后取平均值。但是还有其他好方法吗?

【问题讨论】:

  • 你也可以使用标准差,看看这里link

标签: python django


【解决方案1】:

您可以为此使用aggregate()F expressions

from django.db.models import Avg, F

Model.objects.aggregate(average_delta=Avg(F('done_at') - F('created_at')))

【讨论】:

  • 感谢您的帮助。问题是我正在使用sqlite3 和字段不是date/time 保存为文本。 ://
  • 这个没测试,不过好像有解决办法:stackoverflow.com/a/32686206/517560
【解决方案2】:

除了this answer,你也可以试试这个

from django.db.models import Avg, F

Model.objects.annotate(diff=F('done_at') - F('created_at')).aggregate(duration=Avg('diff'))

【讨论】:

  • 感谢您的帮助。无法解决将字符串转换为 avg 的日期时间的问题
  • 我认为这对你来说很难。无论如何尝试Django Cast()
  • 非常感谢,我一开始就像你写的那样,但问题是我试图用DateTimeField 投射它:)
【解决方案3】:

使用 Jieter 和 Jerin Peter George 的答案几乎没有变化,而且效果很好:

from django.db.models import Avg, F, Sum, DurationField

IssueDone.objects.annotate(time_elapsed=Sum(Cast(F('done_date')-F('created_date'), DurationField()))).aggregate(Avg('time_elapsed'))

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多