Explain Codes LogoExplain Codes Logo

Age from birthdate in python

python
prompt-engineering
functions
datetime
Anton ShumikhinbyAnton Shumikhin·Jan 29, 2025
TLDR

Here's an elegant one-liner using Python's datetime module to calculate age:

from datetime import datetime # Assuming birthdate is a datetime object age = datetime.now().year - birthdate.year - ((datetime.now().month, datetime.now().day) < (birthdate.month, birthdate.day))

This swiftly computes the age by factoring in whether the birthday has happened this year. After all, a year is not up until the party's over!

Age calculation considering leap years

Factoring in leap years

When working with leap years, you might feel like you've taken a leap of faith. After all, birthdays on February 29 present a unique challenge:

def calculate_age(birthdate): today = datetime.now().date() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day)) # In the spirit of every-four-years, handle Leap Day Birthdays! if birthdate.month == 2 and birthdate.day == 29: try: leap_year_birthday = birthdate.replace(year=today.year) except ValueError: # If not leap year, we "round down" to Feb 28 leap_year_birthday = birthdate.replace(year=today.year, day=28) if today < leap_year_birthday: age -= 1 # We circle back to this birthday, the party isn't over yet! return age

Timezones: more than just jet lag

In a world spinning round (24 timezones!), your date calculations need to keep the pace. Make sure your datetime dances to the right rhythm:

from datetime import datetime import pytz def calculate_age_with_timezone(birthdate, timezone_name): timezone = pytz.timezone(timezone_name) now_with_timezone = datetime.now(timezone) # +1 for global thinking! return now_with_timezone.year - birthdate.year - ((now_with_timezone.month, now_with_timezone.day) < (birthdate.month, birthdate.day))

Practical visualisation

Imagine that each year is a marker on a measuring tape📏:

Start (Birthdate): 2000-01-01 (⏳beginning) Now (Today): 2023-03-25 (⌛end)

The age calculation translates like so:

from datetime import date birthdate = date(2000, 1, 1) today = date.today() age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day))

Unrolling the tape measures out the years:

⏳---1Y---2Y---...---22Y---23Y ⌛

Here, ⏳ is the birthdate and ⌛ represents today's date. The markers (-) are the years elapsed between the two. The mathematical calculation unveils the distance covered on this tape: the person's age in years.

Advanced tricks and tips

Dates and strings: Playing well together

Handling dates can be like herding cats if they come in all shapes and sizes. Here's a solution for dealing stylishly with string-formatted birthdates:

from datetime import datetime def convert_and_calculate_age(birthdate_str, date_format='%Y-%m-%d'): birthdate = datetime.strptime(birthdate_str, date_format) # My cats speak `%Y-%m-%d` language! # (days lived) // (days in a year) = age. Simple math, right? return (datetime.now() - birthdate).days // 365

Precise age with relativedelta

For those who like the consolation of precision, balance the relativedelta beam from python-dateutil:

from dateutil.relativedelta import relativedelta def precise_age(birthdate): today = datetime.now() delta = relativedelta(today, birthdate) # it takes two to make an age go right! return delta.years

Age with Django's DateField

Django enthusiasts, here's an age calculation snippet right out of the Django model recipe book:

from django.db import models from datetime import datetime class Person(models.Model): birthdate = models.DateField() def age(self): today = datetime.now().date() # Life's not complete without a birthday! return today.year - self.birthdate.year - ((today.month, today.day) < (self.birthdate.month, self.birthdate.day))

Include UTC time

For those who answer to a higher time, UTC is the only language spoken. Translate your dates well:

from datetime import datetime def calculate_age_utc(birthdate): utc_now = datetime.utcnow() # UTC says... tick tock on the clock! return utc_now.year - birthdate.year - ((utc_now.month, utc_now.day) < (birthdate.month, birthdate.day))

Elevate your performance game

Seek to squeeze all the performance juice. Here's to writing minimalist and efficient code! After all, Python is not a snake, it won't bite back.