在Python中计算平均年龄
我正在使用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)