Расчет среднего возраста в Python - PullRequest
0 голосов
/ 27 декабря 2011

Я использую Django и пытаюсь вычислить средний возраст клиента, и по какой-то причине этот ответ ускользает от меня. То, что я хочу сделать, это перебрать всех клиентов в группе и получить среднюю дельту сегодняшнего дня и их dob.

Вот как выглядит модель:

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

Метод, который я использую, создает список dob, как этот [(datetime.date (1976, 8, 4),), (datetime.date (2005, 8, 8),), (datetime.date ( 1986, 10, 14),)]

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Это даст вам средний возраст в виде временной шкалы:

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)

Редактировать:

Поскольку я был потенциально большим, я избежал второго списка:

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)
0 голосов
/ 18 сентября 2016

Вот адаптированное решение принятого ответа с использованием 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...