【问题标题】:converting a Django ValuesListQuerySet object to a float将 Django ValuesListQuerySet 对象转换为浮点数
【发布时间】:2021-06-18 04:39:21
【问题描述】:

我将时间数据(以纪元时间)保存在 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()),
    })

【问题讨论】:

  • 只有一个成员?如果有多个,那该怎么办?

标签: python django timezone


【解决方案1】:

您应该执行到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]

【讨论】:

  • 像魔术一样工作,谢谢!如果您不介意我问,映射到日期时间对象与说通过 for 循环将 django 查询对象转换为日期时间对象有什么区别?
  • @cookiestarninja:没有区别,但列表理解通常更简洁。
  • 亲爱的,我会继续阅读的。再次感谢!
猜你喜欢
  • 2021-08-11
  • 2021-05-24
  • 2021-12-18
  • 1970-01-01
  • 2022-11-21
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
相关资源
最近更新 更多