在Python中计算平均年龄

0 投票
2 回答
2647 浏览
提问于 2025-04-17 09:04

我正在使用Django框架,想要计算客户的平均年龄,但不知道怎么做。我想要做的是遍历一个组里的所有客户,计算今天的日期和他们出生日期之间的平均差值。

这是我的模型长这样:

class Client (models.model):
  ...
  dob = models.DateField(
                         null = False
                        )

所以我想做的事情大概是这样的:

def age(self,qrydtm=date.today())
  # here is a method (from funcs.py) that returns a list of dob for the group
  delta = 
  delta_m = ((qrydate.year - self.dob.year)*12)+(qrydate.month - self.dob.month)         
  years = delta_m // 12
  weeks = delta // 7
  months = (delta_m - (years*12))
  if (years > 0):
    return ('%s yr - %s mn' % (years,months))
  else:
    return ('%s wk' % (weeks))  

我现在使用的方法,会生成一个出生日期的列表,像这样:[(datetime.date(1976, 8, 4),),(datetime.date(2005, 8, 8),),(datetime.date(1986, 10, 14),)]

2 个回答

0

这里有一个经过调整的解决方案,使用了 relativedelta,这个方法的描述更清楚:

from datetime import date
from dateutil.relativedelta import relativedelta
l = [date(2006, 9, 17), date(2004, 9, 17), ]
today = date.today()
average_age = sum((relativedelta(today, x) for x in l), relativedelta(0)) / len(l)

然后 average_age 输出的结果是 relativedelta(years=+11, months=+4, days=+17)

1

这段代码会帮你计算出平均年龄,结果会以时间间隔的形式显示:

l = [datetime.date(1976, 8, 4), datetime.date(2005, 8, 8), ...] # values_list(flat=True)
today = datetime.date.today()
average_age = sum(map(lambda x: today-x, l), datetime.timedelta(0))/len(l)

补充:

因为l可能会很大,所以我避免使用第二个列表:

from datetime import date, timedelta
l = [date(1976, 8, 4), date(2005, 8, 8), ...] # values_list(flat=True)
today = date.today()
average_age = sum((today - x for x in l), timedelta(0)) / len(l)

撰写回答