【问题标题】:Why doesn't django.db.models.Avg() return a datetime object? And why is what it returns wrong?为什么 django.db.models.Avg() 不返回日期时间对象?为什么它返回错误?
【发布时间】:2015-02-26 09:29:01
【问题描述】:

这是我的 Django 模型:

class MyModel(models.Model):
    a = IntegerField()
    b = DateTimeField()

这是我在此模型上执行的查询集,用于查找 bs 的每个 a 值的计数、最小值、最大值和平均值:

>>> MyModel.objects.values('a').annotate(count=Count("b"), min=Min('b'), max=Max('b'), avg=Avg('b'))

{'a': 1, 'count': 2, 
 'avg': 20150226046183.0, 
 'min': datetime.datetime(2015, 2, 26, 1, 8, 22, tzinfo=<UTC>), 
 'max': datetime.datetime(2015, 2, 26, 8, 15, 44, tzinfo=<UTC>)}

查看与avg 键关联的值。它是一个浮子。为什么? DateTimeFields 的平均值应该是 DateTimeField 吧?那么为什么它是所有事物的浮动呢?我什至可以理解一个字符串——但绝对不是一个浮点数。这不是十进制数值数据。

一旦我们解决了这个问题,我就可以从浮点数中解析出数据来弄清楚 Django 的含义。我可以看到20150225 显然表示 2015 年 2 月 26 日。但是等等,这意味着一天中的时间将由 046183.0 表示。这到底是什么意思?凌晨 4 点 61 分和 83 秒?没有意义。

有人可以向我解释这一切吗?好像有点乱。

【问题讨论】:

  • 2014 年 3 月 2 日、1886 年 9 月 3 日和 1949 年 12 月 12 日的平均值是多少?
  • @LegoStormtroopr 我是这样想的:每个日期时间都可以表示为具有定义端点的半开线段上的一个点(因此它可以表示为一个数值,例如从端点,所以算术平均值是可计算的)。

标签: python django django-models django-database


【解决方案1】:

从源代码 Avg 总是返回一个浮点数:

class Avg(Aggregate):
    function = 'AVG'
    name = 'Avg'

    def __init__(self, expression, **extra):
        super(Avg, self).__init__(expression, output_field=FloatField(), **extra)

    def convert_value(self, value, expression, connection, context):
        if value is None:
            return value
        return float(value)

您可以做的是将您的 datetime 对象转换为 unix 时间戳(自 1970 年初以来经过的秒数,没有闰秒)并使用 extra() 方法计算平均值。

MyModel.objects.extra('avg': 'AVG(UNIX_TIMESTAMP(b))'.values('avg')

我建议您在转换 unix 时间和日期时间对象之前阅读this,因为您必须考虑到原始日期时间和有意识日期时间之间的差异。

【讨论】:

  • 你的回答很有帮助,让我很接近。但它给我带来了其他问题。您发布的答案中也存在一些语法错误。所以我在这里问了一个类似的问题:stackoverflow.com/questions/28758714/…
【解决方案2】:

django's source code,它总是返回float。看起来Avg 的意图是与数字一起使用。

您可以尝试使用strptime 转换返回的浮点数,我没有尝试过,也不确定返回的浮点数是否是您要查找的平均值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2016-09-12
    相关资源
    最近更新 更多