In [1]:
import datetime
from operator import sub
from dateutil.relativedelta import relativedelta

In [91]:
def been_alive_for(birthday, now=datetime.datetime.now()):
    delta = relativedelta(now, birthday)
    
    if delta.months:
        days = 30*delta.months
    else:
        days = delta.days
    
    data = {
        'years': delta.years,
        'weeks': days / 7,
    }
    
    data['days'] = days - (data['weeks'] * 7)
    
    if data['weeks'] < 1:
        data['days'] = days
        data['weeks'] = None
    else:
        week_remainder = data['weeks'] - round(data['weeks'], 0)
        data['weeks'] = round(data['weeks'], 0)
        data['days'] = data['days'] + (week_remainder * 7)
    
    if data['days'] < 0:
        data['weeks'] = data['weeks'] - 1
        data['days'] = 7 + data['days']
    
    data['hours'] = delta.hours
    data['minutes'] = delta.minutes
    
    display = []
    
    for key, value in data.items():
        if value:
            display.append(('{0} {1}'.format(round(value), key)))

    return ', '.join(display)

In [92]:
been_alive_for(datetime.datetime(1986, 9, 19, 8, 22))


Out[92]:
'32 years, 4 days, 8 hours, 6 minutes'

In [93]:
been_alive_for(datetime.datetime(2000, 1, 1), datetime.datetime(2000, 1, 1, 1, 1))


Out[93]:
'1 hours, 1 minutes'

In [94]:
been_alive_for(datetime.datetime(2000, 1, 1), datetime.datetime(2000, 1, 1, 1, 10))


Out[94]:
'1 hours, 10 minutes'

In [95]:
been_alive_for(datetime.datetime(2000, 1, 1), datetime.datetime(2010, 1, 1))


Out[95]:
'10 years'

In [ ]: