簡體   English   中英

將 Django ValuesListQuerySet object 轉換為浮點數

[英]converting a Django ValuesListQuerySet object to a float

我在 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 來可視化數據)。 任何指針?

參考代碼:

視圖.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()),
    })

您應該執行到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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM