Saltar a contenido

Tiempo, fechas y horas: time, datetime, calendar

A menudo necesitamos utilidades para calcular tiempos, horas, fechas, etc. En Python lo tenemos muy fácil gracias a estos tres módulos.

Las funciones del módulo time están relacionadas con tiempos de espera y tiempos de cómputo. Por ejemplo, time.perf_counter() mide tiempo real, incluyendo tiempo de inactividad. Sólo tiene sentido si calculamos una diferencia entre dos llamadas:

import time
import math

inicio = time.perf_counter()  # Empezamos el "cronómetro"

fact = math.factorial(100000)  # Cálculo largo
print(str(fact)[:10])  # Primeros 10 dígitos
# >> 2824229407
fin_factorial = time.perf_counter()  # Fin del cálculo largo
time.sleep(1)  # Ahora un segundo de inactividad

fin = time.perf_counter()  # Paramos el "cronómetro"

print(f'Tiempo de cálculo: {fin_factorial - inicio:.2f} segundos')
print(f'Tiempo total: {fin - inicio:.2f} segundos')
# >> Tiempo de cálculo: 2.38 segundos
# >> Tiempo total: 3.38 segundos

Por otro lado, time.process_time() mide tiempo de proceso, sin incluir el tiempo que el proceso está inactivo (por ejemplo, esperando a que el usuario introduzca algún valor o esperando a algún dispositivo de E/S):

import time
import math

inicio = time.process_time()  # Empezamos el "cronómetro"

fact = math.factorial(100000)  # Cálculo largo
print(str(fact)[:10])  # Primeros 10 dígitos
# >> 2824229407
fin_factorial = time.process_time()  # Fin del cálculo largo
time.sleep(1)  # Ahora un segundo de inactividad

fin = time.process_time()  # Paramos el "cronómetro"

print(f'Tiempo de cálculo: {fin_factorial - inicio:.2f} segundos')
print(f'Tiempo total: {fin - inicio:.2f} segundos')
# >> Tiempo de cálculo: 2.44 segundos
# >> Tiempo total: 2.45 segundos

Información

La pequeña discrepancia en el tiempo de cálculo y tiempo total del último ejemplo se debe a que la propia llamada a time.sleep(1), así como time.process_time(), tiene cierta sobrecarga.

Podemos usar datetime para lidiar con fechas y horas del "mundo real":

from datetime import datetime

# Mi fecha de nacimiento
nacimiento = datetime(1995, 4, 22, 6, 0)
print(nacimiento.weekday())  # ¿Qué día de la semana? (0 = lunes)
# >> 5

# ¿Cuántos años tengo? (datetime - datetime = timedelta)
td = datetime.now() - nacimiento
print(td)
# >> 9473 days, 13:30:38.442574
print(td.days // 365)
# >> 25
print(td.total_seconds())
# >> 818515838.442574

Por último calendar contiene utilidades relacionadas con calendarios: años bisiestos, nombres de los meses/días de la semana...

import calendar

# Para configurar la localización de fecha/hora a España,
# tenemos que ejecutar lo siguiente:
import locale
locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')


nombre_dia_semana = calendar.day_name[nacimiento.weekday()]
nombre_dia_mes = calendar.month_name[nacimiento.month]
print(f'Nací un {nombre_dia_semana}, {nacimiento.day} de {nombre_dia_mes} de {nacimiento.year}')
# >> Nací un sábado, 22 de abril de 1995

Cuidado

Si tu aplicación necesita gestionar más de una localización (p. ej.: español de España y español de México) se desaconseja el uso de locale.setlocale(). Este es sólo un pequeño ejemplo.


Última actualización: June 21, 2021