Los módulos datetime y calendar amplían las posibilidades del módulo time que provee funciones para manipular expresiones de tiempo.
Al comienzo de un programa tendremos que importar estos módulos para tener acceso a un conjunto amplio de clases y funciones:
from datetime import datetime, date, time, timedelta import calendar
Mostrar fecha y hora (datetime)
ahora = datetime.now() # Obtiene fecha y hora actual
print("Fecha y Hora:", ahora) # Muestra fecha y hora
print("Fecha y Hora UTC:",ahora.utcnow()) # Muestra fecha/hora UTC
print("Día:",ahora.day) # Muestra día
print("Mes:",ahora.month) # Muestra mes
print("Año:",ahora.year) # Muestra año
print("Hora:", ahora.hour) # Muestra hora
print("Minutos:",ahora.minute) # Muestra minuto
print("Segundos:", ahora.second) # Muestra segundo
print("Microsegundos:",ahora.microsecond) # Muestra microsegundo
Comparando fechas y horas (datetime, date)
print("Horas:")
hora1 = time(10, 5, 0) # Asigna 10h 5m 0s
print("\tHora1:", hora1)
hora2 = time(23, 15, 0) # Asigna 23h 15m 0s
print("\tHora2:", hora2)
# Compara horas
print("\tHora1 < Hora2:", hora1 < hora2) # True
print("Fechas:")
fecha1 = date.today() # Asigna fecha actual
print("\tFecha1:", fecha1)
# Suma a la fecha actual 2 días
fecha2 = date.today() + timedelta(days=2)
print("\tFecha2:", fecha2)
# Compara fechas
print("\tFecha1 > Fecha2:", fecha1 > fecha2) # False
Aplicando formatos a fechas y horas (Máscaras)
Las siguientes claves se combinan para aplicar formatos:
| %a | Nombre local abreviado de día de semana |
| %A | Nombre local completo de día de semana |
| %b | Nombre local abreviado de mes |
| %B | Nombre local completo de mes |
| %c | Representación local de fecha y hora |
| %d | Día de mes [01,31] |
| %H | Hora (horario 24 horas) [00,23] |
| %I | Hora (horario 12 horas) [01,12] |
| %j | Número de día del año [001,366] |
| %m | Mes [01,12] |
| %M | Minuto [00,59] |
| %p | Etiqueta AM o PM |
| %S | Segundo |
| %U | Nº semana del año. Se considera al Domingo como primer día de semana [00,53] |
| %w | Establece el primer día de semana [0(Domingo),1(Lunes)... 6]. |
| %W | Nº semana del año (Se considera al Lunes como primer día de semana) [00,53] |
| %x | Fecha local |
| %X | Hora local |
| %y | Año en formato corto [00,99] |
| %Y | Año en formato largo |
| %Z | Nombre de Zona Horaria |
Ejemplos:
# Asigna formato de ejemplo1
formato1 = "%a %b %d %H:%M:%S %Y"
# Asigna formato de ejemplo2
formato2 = "%d-%m-%y %I:%m %p"
hoy = datetime.today() # Asigna fecha-hora
# Muestra fecha-hora según ISO 8601
print("Fecha en formato ISO 8601:", hoy)
# Aplica formato ejemplo1
cadena1 = hoy.strftime(formato1)
# Aplica formato ejemplo2
cadena2 = hoy.strftime(formato2)
# Muestra fecha-hora según ejemplo1
print("Formato1:", cadena1)
# Muestra fecha-hora según ejemplo2
print("Formato2:", cadena2)
Para convertir una cadena a objeto datetime
objeto_datetime = datetime.strptime(cadena1, formato1)
print("strptime:", fecha1.strftime(formato1))
Operaciones con fechas y horas
Se utiliza la función timedelta que permite operar con: microseconds, milliseconds, seconds, minutes, hours, days y weeks
hoy = date.today() # Asigna fecha actual ayer = hoy – timedelta(days=1) # Resta a fecha actual 1 día mañana = hoy + timedelta(days=1) # Suma a fecha actual 1 día diferencia_en_dias = mañana – hoy # Resta las dos fechas
Otros ejemplos de operaciones con otras unidades de tiempo
hoy_mas_1_millon_segundos = hoy + timedelta(seconds=1000000)
ahora = datetime.now()
hora_actual = time(ahora.hour, ahora.minute, ahora.second)
mas_5m = ahora + timedelta(seconds=300)
mas_5m = time(mas_5m.hour, mas_5m.minute, mas_5m.second)
racion_de_5h = timedelta(hours=5)
mas_5h = ahora + racion_de_5h
print("Ayer:", ayer)
print("Hoy:", hoy)
print("Mañana:", mañana)
print("Diferencia en días entre mañana y hoy:",
diferencia_en_dias.days)
print("La fecha de hoy más 1 millón de segundos:",
hoy_mas_1_millon_segundos)
print("Hora actual:", hora_actual)
print("Hora actual + 5 minutos:", mas_5m)
print("Hora actual + 5 horas:", mas_5h)
Diferencia entre dos fechas (datetime)
# Asigna datetime de la fecha actual
fecha1 = datetime.now()
# Asigna datetime específica
fecha2 = datetime(1995, 11, 5, 0, 0, 0)
diferencia = fecha1 - fecha2
print("Fecha1:", fecha1)
print("Fecha2:", fecha2)
print("Diferencia:", diferencia)
print("Entre las 2 fechas hay ",
diferencia.days,
"días y ",
diferencia.seconds,
"seg.")
Diferencia entre dos fechas en días (datetime y strptime)
formato_fecha = "%d-%m-%Y"
fecha_inicial = datetime.strptime("01-10-2013",
formato_fecha)
fecha_final = datetime.strptime("25-12-2013",
formato_fecha)
diferencia = fecha_final - fecha_inicial
print("Fecha inicial:", fecha_inicial)
print("Fecha final:", fecha_final)
print("Diferencia:", diferencia.days, "días")
Diferencia de dos fechas en días, introducidas por teclado
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# diferencia-entre-fechas-teclado.py
#
# Diferencia de dos fechas en días introducidas por teclado,
# con control de errores.
#
from datetime import datetime
def main():
# Establecer formato de las fechas a introducir: dd/mm/aaaa
formato = "%d/%m/%Y"
# Bucle 'sin fin'
while True:
try:
# Introducir fecha inicial utilizando el formato definido
fecha_desde = input('Introducir fecha inicial (dd/mm/aaaa): ')
# Si no se introduce ningún valor se fuerza el final del bucle
if fecha_desde == "":
break
# Introducir fecha final utilizando el formato definido
fecha_hasta = input('Introducir fecha final (dd/mm/aaaa): ')
# Si no se introduce ningún valor se fuerza el final del bucle
if fecha_hasta == "":
break
# Se evaluan las fechas según el formato dd/mm/aaaa
# En caso de introducirse fechas incorrectas se capturará
# la excepción o error
fecha_desde = datetime.strptime(fecha_desde, formato)
fecha_hasta = datetime.strptime(fecha_hasta, formato)
# Se comprueba que fecha_hasta sea mayor o igual que fecha_desde
if fecha_hasta >= fecha_desde:
# Se cálcula diferencia en día y se muestra el resultado
diferencia = fecha_hasta - fecha_desde
print("Diferencia:", diferencia.days, "días")
else:
print("La fecha fecha final debe ser mayor o igual que la inicial")
except:
print('Error en la/s fecha/s. ¡Inténtalo de nuevo!')
return 0
if __name__ == '__main__':
main()
A partir de una hora se obtiene fracción del día
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# A partir de una hora introducida por teclado se obtiene
# fracción del día, teniendo en cuenta que 24 horas = 86400 seg
# Formato de entrada: hh:mm:ss
# Valores Hora...: 0 a 23
# Valores Minuto.: 0 a 59
# Valores Segundo: 0 a 59
from datetime import datetime
formato = "%H:%M:%S"
while True:
try:
hhmmss = input('Introducir hora (hh:mm:ss): ')
if hhmmss == "":
break
hhmmss = datetime.strptime(hhmmss, formato)
horas = hhmmss.hour
minutos = hhmmss.minute
segundos = hhmmss.second
hhmmss_seg = (horas * 60 * 60) + (minutos * 60) + segundos
resultado = float(hhmmss_seg / 86400)
print("Resultado: ", resultado)
except:
print('Error en el formato de hora introducido.')
print('-> Formato válido: hh:mm:ss ¡Inténtalo de nuevo!')
Diferencia de dos fechas (date)
hoy = date.today()
navidad_año_proximo = date(2024, 12, 25)
faltan = navidad_año_proximo - hoy
print ("Hoy:", hoy)
print ("La navidad del 2024", navidad_año_proximo)
print ("Faltan", faltan.days, "días")
Expresar una fecha en formato largo
print("Hoy es...", datetime.ctime(fecha1))
A partir de una fecha se obtiene tupla con año, nº semana y día de semana
print("Fecha", fecha1,
"Año, nº sem., día sem.:",
datetime.isocalendar(fecha1))
A partir de una fecha se obtiene tupla con año, nº semana y día de semana
También, se muestra el día de la semana en letras (abreviado).
print("Desglose de la fecha", fecha2,":")
tupla_mensajes = ("Año", "Núm. semana", "Núm. día de semana")
tupla_valores = datetime.isocalendar(fecha2)
tupla_diassem = ("Lun", "Mar", "Mié", "Jue","Vie", "Sáb","Dom")
for mensaje,valor in zip(tupla_mensajes, tupla_valores):
print(mensaje,"-->", valor)
print("Día de semana-->", tupla_diassem[tupla_valores[2]-1])
Obtener día de la semana por su número
La función weekday() devuelve el número de día de la semana a que corresponda la fecha indicada, según los siguientes valores por día: 0-Lunes, 1-Martes, 2-Miércoles, 3-Jueves, 4-Viernes , 5-Sábado y 6-Domingo
dia_semana = datetime.weekday(fecha1)
print(fecha1, "->", dia_semana,"->",
tupla_diassem[dia_semana])
Obtener y contar los días que sean martes entre dos fechas
from datetime import datetime, timedelta
formato = "%d/%m/%Y"
contador = 0
fechadesde = input('Fecha desde (dd/mm/aaaa): ')
fechahasta = input('Fecha hasta (dd/mm/aaaa): ')
if fechadesde == '' or fechahasta == '':
exit()
try:
fechadesde = datetime.strptime(fechadesde, formato)
fechahasta = datetime.strptime(fechahasta, formato)
if fechadesde > fechahasta:
print('Fecha desde debe ser menor o igual que hasta')
while fechadesde <= fechahasta:
if datetime.weekday(fechadesde) == 1:
contador +=1
fechaactual = fechadesde.strftime(formato)
print(contador, fechaactual, 'es martes')
fechadesde = fechadesde + timedelta(days=1)
except:
print('Fecha incorrecta')
Obtener día de la semana por su número
La función isoweekday() devuelve el número de día de la semana a que corresponda la fecha indicada, según los siguientes valores por día: 1-Lunes, 2-Martes, 3-Miércoles, 4-Jueves, 5-Viernes, 6-Sábado y 7-Domingo.
dia_semana = datetime.isoweekday(fecha1)
print(fecha1, "->", dia_semana,"->",
tupla_diassem[dia_semana-1])
Dado el ordinal se obtiene la fecha correspondiente
print("Si la fecha 01-01-0001 tiene el ordinal 1 entonces...")
for num in range(1,7):
print("El día", 10 ** num ,
"se corresponde con",
date.fromordinal(10 ** num))
Dada una fecha se obtiene un ordinal (01-01-0001 -> 1)
fecha3 = datetime(1, 1, 1, 0, 0, 0)
print("La fecha", fecha3,
"tiene el ordinal",
date.toordinal(fecha3))
print("La fecha", fecha1,
"tiene el ordinal",
date.toordinal(fecha1))
Obtener una tupla a partir de fecha-hora (datetime)
tupla_fechahora = fecha1.timetuple() for elemento in tupla_fechahora: print(elemento)
Convertir un ordinal en fecha-hora (fromtimestamp)
El ordinal 0 se corresponde con la fecha -> 1-1-1970 01:00:00
print("Ordinal 0 -> 1-1-1970 01:00:00")
ordinales_tiempo = (0, 1, 2, 60, 3600)
for elemento in ordinales_tiempo:
print(elemento, "->" , datetime.fromtimestamp(elemento))
Obtener calendario del mes actual (calendar.month)
año = date.today().year mes = date.today().month calendario_mes = calendar.month(año, mes) print(calendario_mes)
Obtener calendario del mes actual (calendar.TextCalendar)
Se establece el lunes como primer día de la semana
calendario = calendar.TextCalendar(calendar.MONDAY) calendario.prmonth(año, mes)
Obtener matriz con calendario de mes actual: (Calendar monthdayscalendar)
calendario = calendar.Calendar()
for elemento in calendario.monthdayscalendar(año, mes):
print(elemento)
Obtener matriz de tuplas con calendario: (Calendar monthdays2calendar)
El primer valor de cada par es el número de día del mes y el segundo valor se corresponde con el número de día de la semana: 0:lunes, 1:martes, 2:miércoles, etc.
calendario = calendario.monthdays2calendar(año, mes)
for elemento in calendario:
print(elemento)
Calendario completo del año 2018
Día de comienzo: Lunes
print(calendar.TextCalendar(calendar.MONDAY).formatyear(2018,
2, 1, 1, 2))
Relacionado:
Ir al índice del tutorial de Python
