2 回答

TA贡献1963条经验 获得超6个赞
您只需要在此处运行自定义 1-liner 即可将time对象组合成timedelta对象,然后可以将这些对象相加。(见“打印”行)
from datetime import datetime, timedelta
import pandas as pd
phone = PhoneRecord.objects.all()
df = pd.DataFrame(list([i.__dict__ for i in phone])) # create pd.df from model query
df.et = df.et.fillna('00:00:00') # some records are blank
print(df.et)
print("SUM:", sum([datetime.combine(datetime.min, time) - datetime.min for time in df.et.tolist()], timedelta()))
你应该得到这样的东西:
0 00:00:20
1 00:00:20
2 00:00:50
3 00:00:30
4 00:00:20
SUM: 0:02:20
我不得不稍微改变一些东西才能让它们在我的一端工作,所以希望你和你的 Pandas 和 Django 版本一样。希望这可以帮助!

TA贡献1811条经验 获得超5个赞
所有计算,例如获取平均值、计数等,都应(如果可能)使用数据库引擎执行。我不知道潜在的问题,但pandas在服务器端使用来获取平均值绝对是矫枉过正。您需要查看Django 的聚合功能。
此外,您可能需要重构模型。如果您需要存储电话交谈的持续时间,您可以使用 FloatField 代替,例如
class PhoneRecord(models.Model):
duration = models.FloatField(blank=True, default=0.0, help_text=_('duration in seconds'))
# other fields...
# also, you can set up the duration field with `editable=False`, and
# calculate its value each time the record is created
在这种情况下,您可以使用 Avg:
from django.db.models import Avg
PhoneRecords.objects.all().aggregate(Avg('duration'))
得到这样的东西
{'duration_avg': 12.3}
添加回答
举报