猿问

使用 Pandas 求和 TimeField 小时/分钟

我正在尝试使用 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'


我需要做什么才能对数据求和并求平均值。


慕的地10843
浏览 276回答 2
2回答

神不在的星期二

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

四季花海

所有计算,例如获取平均值、计数等,都应(如果可能)使用数据库引擎执行。我不知道潜在的问题,但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 AvgPhoneRecords.objects.all().aggregate(Avg('duration'))得到这样的东西{'duration_avg': 12.3}
随时随地看视频慕课网APP

相关分类

Python
我要回答