总和时间字段与熊猫的小时/分钟

时间:2019-03-02 04:14:37

标签: python django pandas

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

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

谢谢。

2 个答案:

答案 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)

您只需要在此处运行自定义的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版本相同。希望这会有所帮助!