Uno de los datos que muy probablemente utilizaremos en nuestros programas, son las fechas y las horas. Tanto una fecha como una hora pueden ser creadas como un dato tipo cadena, y podremos utilizarla como cualquier otra cadena.
Sin embargo, si queremos operar con este tipo de datos, la cadena no es ni de lejos el mejor formato que podemos elegir. Lo más adecuado sin duda, es hacer uso del módulo datetime. Para hacer uso de este módulo, deberemos de importarlo (o importar las instrucciones que vayamos a utilizar). Viene por defecto en Python.
datetime.now( ) Con este método del módulo datetime, podemos obtener la fecha y la hora actuales en el momento de ejecutar el código.
from datetime import datetime
now = datetime.now()
print(f"Objeto datetime: {now}")
now_hora=now.strftime("Hora actual: %H:%M:%S")
now_fecha=now.strftime("Fecha actual: %d/%m/%Y")
print(now_hora)
print(now_fecha)Resultado cuando ejecuté el código:
Hora actual: 16:00:53
Fecha actual: 17/07/2026En el código anterior, hemos obtenido un objeto datetime aplicando el método .now( ). A continuación, hemos aplicado a este objeto el método .strftime con los parámetros adecuados para extraerle la fecha y la hora.
objetoDatetime.strftime(texto+formato). Con este método aplicable a un objeto datetime, podemos obtener una cadena de texto que contenga una fecha, una hora, o ambos. Esta cadena puede ser configurada a nuestro gusto utilizando los siguientes códigos, que pueden ir acompañados de todos los caracteres de texto que queramos. En el ejemplo anterior, hemos obtenido una cadena con la hora y otra con la fecha. Los códigos de formato para las fechas y las horas son los siguientes:
- %d Día del mes con dos dígitos (01,02,03…)
- %-d Día del mes con uno o dos dígitos (1,2,3….)
- %m Mes con dos dígitos.
- %-m Mes con uno o dos dígitos.
- %B Nombre completo del mes.
- %b Nombre del mes abreviado.
- %Y Año con cuatro dígitos.
- %y Año con dos dígitos.
- %-y Año con uno o dos dígitos.
- %A Día de la semana.
- %a Día de la semana abreviado.
- %H Hora con dos dígitos (formato 24 horas).
- %h Hora con uno o dos dígitos (formato 24 horas).
- %I (vocal i mayúscula) Hora con dos dígitos (formato 12 horas).
- %-I Hora con uno o dos dígitos (formato 12 horas).
- %p Indicará PM o AM
- %M Minutos con dos dígitos.
- %m Minutos con uno o dos dígitos.
- %S Segundos con dos dígitos.
- %s Segundos con uno o dos dígitos.
datetime.time (objeto datetime) // datetime.date (objeto datetime) Con estos dos métodos del módulo datetime podemos extraer directamente de un objeto de tipo datetime, otro objeto de tipo datetime, que contenga solo la hora, o solo la fecha. Estos nuevos objetos datetime, podrán configurarse también como texto con el método strftime.
from datetime import datetime
ahora = datetime.now()
print(ahora)
hora = datetime.time(ahora)
print(hora)
fecha= datetime.date(ahora)
print (fecha)
mi_hora=hora.strftime("Hora actual: %H:%M:%S")
print(mi_hora)
El resultado del código anterior son 3 objetos datetime
y una cadena de texto:
2026-07-17 17:27:48.850530
17:27:48.850530
2026-07-17
Hora actual: 17:27:48datetime (año, mes, dia, hora, minuto, segundo)
Será habitual que la fecha o la hora que nos interese manejar no sea la actual, sino otra diferente. En ese caso nos valemos de la función datetime para obtener un objeto datetime con los datos que necesitemos.
from datetime import datetime
cita=datetime(2025, 2, 14, 18, 10,0) ##ATENCION AL ORDEN: AÑO,MES,DIA
print(f"Datos cita en formato datetime: {cita}")
fecha_cita_texto=cita.strftime("La fecha de la cita es %A %d de %B del año %Y")
hora_cita_texto=cita.strftime("La hora de la cita es: %H:%M:%S")
print(fecha_cita_texto)
print(hora_cita_texto)
Datos cita en formato datetime: 2025-02-14 18:10:00
La fecha de la cita es Friday 14 de February del año 2025
La hora de la cita es: 18:10:00Si solo nos interesa la fecha, podríamos haber usado la misma función, poniendo solo los tres primeros parámetros (año, mes, día). El sistema tomaría como hora, la primera hora del día que indiquemos.
from datetime import datetime
cita=datetime(2025, 2, 14)
print(f"Datos cita en formato datetime: {cita}")
fecha_cita_texto=cita.strftime("La fecha de la cita es %A %d de %B del año %Y")
hora_cita_texto=cita.strftime("La hora de la cita es: %H:%M:%S")
print(fecha_cita_texto)
print(hora_cita_texto)
Datos cita en formato datetime: 2025-02-14 00:00:00
La fecha de la cita es Friday 14 de February del año 2025
La hora de la cita es: 00:00:00datetime.strptime(cadena) Con este método podemos convertir una cadena en un dato datetime. Es muy importante indicarle al método, el orden exacto de los parámetros (espacios en blanco y separadores incluidos).
from datetime import datetime
tiempo="2023-12-26 22:50:09"
tiempo_datetime=datetime.strptime(tiempo,"%Y-%m-%d %H:%M:%S")
print(tiempo_datetime)Resultado (el siguiente objeto datetime):
2023-12-26 22:50:09from datetime import datetime
solo_fecha="2023-12-26"
tiempo_datetime=datetime.strptime(solo_fecha,"%Y-%m-%d")
print(tiempo_datetime)Resultado: 2023-12-26 00:00:00Atributos de un objeto Datetime. De un objeto datetime, se pueden obtener todos y cada uno de los atributos que lo componen. Los valores de dichos atributos son todos números enteros.
from datetime import datetime
now = datetime.now()
print(f"El año es: {now.year}")
print(f"El mes es: {now.month}")
print(f"El día es: {now.day}")
print(f"La hora es: {now.hour}:{now.minute}:{now.second}")
print(now.month*3)Resultado en fecha actual:
El año es: 2026
El mes es: 7
El día es: 17
La hora es: 19:41:55
21Como vemos, hemos extraído los atributos .year .month .day .hour .minute .second. Todos ellos son números enteros.
Operaciones entre objetos datetime. Los objetos datetime se pueden comparar entre sí. También se pueden restar. Si restamos dos objetos datetime, el resultado va a ser un nuevo objeto llamado timedelta.
from datetime import datetime
now = datetime.now()
cita= datetime(2027, 1, 8, 20, 10,0)
if now<cita:
print("La cita no ha llegado.")
falta=cita-now
print("Faltan:",falta)
else:
print("La cita ya ha pasado.")Resultado a fecha de hoy (17-7-2026) a las 19:48 (aproximadamente).
La cita no ha llegado.
Faltan: 175 days, 0:19:34.316220El nuevo objeto creado al restar dos objetos datetime (que será del tipo timedelta), nos muestra los días, y después las horas, minutos, segundos y milésimas de segundos (en este caso 316).
Objetos timedelta ( ).
El objeto timedelta aparece como resta de dos objetos datetime. También podemos obtenerlo con el siguiente constructor:
valor_timedelta=timedelta(weeks=0,days=0,hours=0,minutes=0,seconds=0, microseconds=0, milliseconds=0)
Sustituiremos el 0 por el valor entero que nos interese (si su valor es 0, no incluimos el dato en el objeto).
Para poder utilizar este constructor, tenemos que importarlo de datetime. Un objeto timedelta solo tiene dos atributos: .days y .seconds.
from datetime import datetime, timedelta
objeto_timedelta=timedelta(weeks=1,hours=13,seconds=23, milliseconds=4)
print(objeto_timedelta)
print("Días:",objeto_timedelta.days)
print("Segundos:",objeto_timedelta.seconds)Resultado:
7 days, 13:00:23.004000
Días: 7
Segundos: 46823Un valor timedelta, puede tener un valor negativo. Veamos con un ejemplo qué formato tiene un valor timedelta negativo:
from datetime import datetime
now = datetime.now()
cita= datetime(2025, 1, 8, 20, 10,0)
timedelta_positivo=cita-now
timedelta_negativo=now-cita
print("Positivo:",timedelta_positivo)
print("Negativo:",timedelta_negativo)
print("Suma de ambos:",(timedelta_negativo+timedelta_positivo))
Positivo: 60 days, 21:45:42.467396
Negativo: -61 days, 2:14:17.532604
Suma de ambos: 0:00:00Como podemos observar el valor timedelta_negativo, tiene los días en negativo y además se le suma un negativo más. En cambio, la hora aparece en positivo.
Vemos que los valores timedelta, pueden sumarse (o restarse entre sí).
Otras operaciones con datos timedelta. Un valor timedelta puede sumarse (o restarse a un valor datetime.
from datetime import datetime, timedelta
now = datetime.now()
timedelta_hora_mas=timedelta(hours=1)
ahora=now.strftime("Hora actual: %H:%M:%S")
verano=now+timedelta_hora_mas
hora_verano=verano.strftime("Hora de verano: %H:%M:%S")
invierno=now-timedelta_hora_mas
hora_invierno=invierno.strftime("Hora de invierno: %H:%M:%S")
print(ahora)
print(hora_verano)
print(hora_invierno)
cita=datetime(2025,1,18,14,30,0)
suma_cita=timedelta(days=-3,hours=-2,minutes=15)
antes_cita=cita.strftime("La cita antes era: %A %d de %B del año %Y a las %H:%M:%S horas.")
resta_citas=cita+suma_cita
nueva_cita=resta_citas.strftime("La cita se ha adelantado. Ahora es: %A %d de %B del año %Y a las %H:%M:%S horas.")
print(antes_cita)
print(nueva_cita)Hora actual: 12:12:23
Hora de verano: 13:12:23
Hora de invierno: 11:12:23
La cita antes era: Saturday 18 de January del año 2025 a las 14:30:00 horas.
La cita se ha adelantado. Ahora es: Wednesday 15 de January del año 2025 a las 12:45:00 horas.Los valores timedelta también se podrían sumar, restar, multiplicar por un número (positivo o negativo), o dividir por un número (entero o decimal). El valor obtenido seguiría siendo de tipo timedelta. También podrían compararse entre sí.
from datetime import datetime, timedelta
unidad_tiempo=timedelta(hours=8,minutes=15,seconds=34)
otra_unidad=unidad_tiempo*7.32
print(otra_unidad)Resultado:
2 days, 12:27:32.880000Aunque sean muy parecidos, los valores datetime y timedelta son totalmente diferentes. Un valor timedelta no representará nunca una hora de reloj, simplemente es una unidad de tiempo. El siguiente código dará error, puesto que un valor timedelta no podrán tener el atributo .strftime que es un atributo de un valor datetime.
from datetime import datetime, timedelta
cita=datetime(2025, 2, 14, 18, 10,0)
hora_cita_texto=cita.strftime("La hora de la cita es %H:%M:%S")
print(hora_cita_texto)
otra_cita=timedelta(hours=2,minutes=15,seconds=34)
print("Esto no es una hora de reloj:",otra_cita)
texto_cita=otra_cita.strftime("La hora de la cita es: %H:%M:%S")
print(texto_cita)La hora de la cita es 18:10:00
Esto no es una hora de reloj: 2:15:34
Traceback (most recent call last):
File "c:\Users\eduar\Desktop\webpython\prueba1.py", line 8, in <module>
texto_cita=otra_cita.strftime("La hora de la cita es: %H:%M:%S")
^^^^^^^^^^^^^^^^^^
AttributeError: 'datetime.timedelta' object has no attribute 'strftime'
