将 Django ValuesListQuerySet 对象转换为浮点数

时间:2021-03-21 09:31:27

标签: python django timezone

我将时间数据(以纪元时间)保存在 MySQL 数据库中作为 IntegerField。我正在做一些数据可视化,我想按小时和按星期几显示订单作为条形图,所以我想将这些纪元时间转换为日期时间对象并相应地可视化数据。但是,datetime.datetime.fromtimestamp() 只接受浮点数,我在将 IntegerField 转换为列表以外的任何内容时遇到问题。 (我也尝试将结果列表转换为浮点数,但得到一个 Type Error: float() argument must be a string or a number)。

我想知道我是否应该继续在我的 views.py 文件中找到一种方法来转换我的纪元时间(Django ValuesListQuerySet 对象),或者我是否应该将我的纪元时间作为 JsonResponse 返回并执行日期时间在我的 javascript AJAX 调用中转换(我使用 charts.js 来可视化数据)。有什么指点吗?

参考代码:

views.py

def charts(request):  # pie chart for payment type
    dow_queryset = Member.objects.order_by('member_created_time').values_list(
        'member_created_time', flat=True) # return only the created time w/o key
    dow_queryset = list(dow_queryset) # list is the only native data type i can convert to successfully
    dow_queryset = float(dow_queryset) # this just .. doesn't work, lol
    
    print(type(dow_queryset))

    hkt = pytz.timezone('Asia/Shanghai')
    dt_obj = hkt.localize(datetime.datetime.fromtimestamp(dow_queryset)) # this line doesn't work as datetime.datetime.fromtimestamp() only takes in a float, whereas `dow_queryset` is either a list/ Django ValuesListQuerySet object 

    
    """
    data - rides by the hour
    """
    hour_count = {}

    for obj in dt_obj:
        if obj.hour == 0:
            hour_count['midnight'] += 1
        elif obj.hour < 6:
            hour_count['early_morning'] += 1
        elif obj.hour < 12:
            hour_count['morning'] += 1
        elif obj.hour < 19:
            hour_count['afternoon'] += 1
        else:
            hour_count['night'] += 1
    
    """
    data - rides by weekday (bar chart)
    """
    weekday_count = {}

    for obj in dt_obj:
        if obj.weekday() == 0:
            weekday_count['monday'] += 1
        elif obj.weekday() == 1:
            weekday_count['tuesday'] += 1
        elif obj.weekday() == 2:
            weekday_count['wednesday'] += 1
        elif obj.weekday() == 3:
            weekday_count['thursday'] += 1
        elif obj.weekday() == 4:
            weekday_count['friday'] += 1
        elif obj.weekday() == 5:
            weekday_count['saturday'] += 1
        elif obj.weekday() == 6:
            weekday_count['tuesday'] += 1
    
    return JsonResponse({
        'labels_day' : list(weekday_count.keys()),
        'data_day': list(weekday_count.values()),
        'labels_hour': list(hour_count.keys()),
        'data_hour': list(hour_count.values()),
    })

1 个答案:

答案 0 :(得分:0)

您应该执行到 datetime 对象的映射:

dow_queryset = Member.objects.order_by('member_created_time').values_list(
        'member_created_time', flat=True
)
hkt = pytz.timezone('Asia/Shanghai')
dt_obj = [hkt.localize(datetime.datetime.fromtimestamp(x)) for x in dow_queryset]
相关问题