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