将 Django ValuesListQuerySet 对象转换为浮点数
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 对象),或者我是否应该 return 我的纪元时间作为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()),
})
您应该执行到 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)) <b>for x in dow_queryset</b>]
我将时间数据(以纪元时间)保存在 MySQL 数据库中作为 IntegerField
。我正在做一些数据可视化,我想按小时和星期几显示订单作为条形图,所以我想将这些纪元时间转换为日期时间对象并相应地可视化数据。但是,datetime.datetime.fromtimestamp()
只接受浮点数,我在将 IntegerField
转换为列表以外的任何内容时遇到了问题。 (我也试过将结果列表转换为浮点数,但得到一个 Type Error: float() argument must be a string or a number
)。
我想知道我是否应该继续寻找一种方法在我的 views.py
文件中转换我的纪元时间(Django ValuesListQuerySet 对象),或者我是否应该 return 我的纪元时间作为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()),
})
您应该执行到 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)) <b>for x in dow_queryset</b>]