我正在尝试使用Pandas对一系列时间(小时,分钟)求和。数据来自TimeField
class PhoneRecord ( models.Model ):
et = models.TimeField ( null=True, blank=True )
在python中,我得到了记录并转换为数据框。
phone = PhoneRecord.objects.all()
df = read_frame ( phone )
df.et = df.et.fillna ( '00:00:00' ) # some records are blank
df [ "time" ] = pd.to_datetime(df.et, format = '%H:%M:%S', errors = 'coerce')
这给了我以下输出。
0 00:00:35
1 00:00:29
2 00:00:00
3 00:00:00
4 00:00:37
......
当我尝试求和
df.time.sum ()
我收到类似以下错误:+不支持的操作数类型:“ datetime.time”和“ datetime.time”
我需要做什么才能对数据求和和求平均。
谢谢。
答案 0 :(得分:1)
所有计算,例如求平均值,计数等,都应使用数据库引擎执行(如果可能)。我不知道潜在的问题,但是在服务器端使用pandas
来获取平均值绝对是过大的。您需要查看Django的aggregation facility。
此外,您可能需要重构模型。如果您需要存储通话的持续时间,则可以改用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}
答案 1 :(得分:1)
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版本相同。希望这会有所帮助!