Comparación de fechas y horas en Python: con y sin zonas horarias

C

Introducción

Al trabajar con fechas, a menudo, le gustaría saber si una fecha determinada es anterior o posterior a otra fecha. Podemos obtener estas respuestas comparando fechas.

En este artículo, aprenderemos a usar Python datetime módulo para crear y comparar fechas ingenuas (sin información de zona horaria) y conscientes (con información de zona horaria).

Para comparar las fechas, usaremos los operadores de comparación en Python: <, >, ==, <=, >=, !=.

Nota: los datetime El módulo tiene dos métodos para crear objetos de fechas: datetime.datetime y datetime.date. Las comparaciones solo se pueden hacer en objetos creados a partir de la misma clase:

datetime.datetime.now() >= datetime.date.today()

Esto resultará en una TypeError:

TypeError: can't compare datetime.datetime to datetime.date

Comparación de fechas y horas ingenuas de zona horaria

Comencemos comparando fechas ingenuas, que no tienen información de zona horaria. Primero, queremos importar el datetime módulo:

from datetime import datetime, date

Luego, hagamos algunas fechas que podamos comparar:

date1 = date(1995, 3, 20)
date2 = date(2020, 1, 1)
dob_a = datetime(1995, 3, 20)
dob_b = datetime(2020, 1, 1)

Comparar estos objetos es tan fácil como comparar, digamos, números enteros. Una fecha es menor que otra, si su tiempo precede al otro.

En nuestro caso, date1 se considera menos<) que date2 porque está más atrás en el tiempo:

print("date1 comes before date2?", date1 < date2)
print("date1 comes after date2?", date1 > date2)
print("date1 is equal to date2?", date1 == date2)

Esto resulta en:

date1 comes before date2? True
date1 comes after date2? False
date1 is equal to date2? False

Ahora, normalmente incorporaría esta lógica en algunas declaraciones de control de flujo:

if  dob_a > dob_b:
    print("person a is older than person b")
else:
    print("person b is older than person a")

Esto resulta en:

person b is older than person a

Comparación de fechas y horas conscientes de la zona horaria

Las zonas horarias pueden complicar un poco las cosas, aunque, afortunadamente, podemos aplicar exactamente la misma lógica a la comparación. La única diferencia es que estamos trabajando con fechas conocidas, fechas con información adicional sobre la zona horaria en la que se encuentran:

from datetime import datetime
import pytz

# Create timezone objects for different parts of the world
tz_ny= pytz.timezone('America/New_York')
tz_lon = pytz.timezone("Europe/London")

# Year, Month, Day, Hour, Minute, Second
datetime = datetime(2010, 4, 20, 23, 30, 0)

# Localize the given date, according to the timezone objects
date_with_timezone_1 = tz_ny.localize(datetime)
date_with_timezone_2 = tz_lon.localize(datetime)

# These are now, effectively no longer the same *date* after being localized
print(date_with_timezone_1) # 2010-04-20 23:30:00-04:00
print(date_with_timezone_2) # 2010-04-20 23:30:00+01:00

print(date_with_timezone_1 == date_with_timezone_2)

Ejecutar este código da como resultado:

False

Mientras que esta declaración:

print(date_with_timezone_1 > date_with_timezone_2)

Resultaría en:

True

Ahora bien, este resultado puede parecerle un poco extraño. Estamos comparando estas dos fechas y horas:

2010-04-20 23:30:00-04:00 # date_with_timezone_1
2010-04-20 23:30:00+01:00 # date_with_timezone_2

Intuitivamente, parece date_with_timezone_2 es de hecho más grande que date_with_timezone_1. Sin embargo, echemos un vistazo a cómo localize() la función funciona.

Aquí, hemos utilizado el pytz biblioteca para dar a conocer nuestras citas ingenuas. Hemos construido un objeto de zona horaria para Nueva York (tz_ny) y un objeto de zona horaria para Londres (tz_lon).

Luego, para inyectar información de zona horaria en nuestro datetime objeto, hemos ejecutado el localize() función y empaquetado el resultado en date_with_timezone_1 y date_with_timezone_2.

Hemos puesto las 11:30 p.m. en localize(), que a su vez creó una fecha y hora para las 11:30 p. m. en Nueva York y las 11:30 p. m. en Londres, respectivamente. Para llegar de las 11:30 p.m. en Nueva York a las 11:30 p.m. en Londres, tendrías que agregar 4 horas. Ha pasado más tiempo para llegar a Nueva York a las 11:30 p. M., Del que tardó en llegar a Londres a las 11:30 p. M. Por tanto, la fecha y hora correspondiente a Nueva York a las 11:30 p.m. es mayor que la fecha y hora correspondiente a Londres a las 11:30 p.m.

Tenga en cuenta este comportamiento cuando trabaje con zonas horarias de esta manera.

Sin embargo, vale la pena señalar que comparar fechas conocidas con fechas ingenuas dará como resultado un error:

date_with_timezone = tz_ny.localize(datetime)
print(datetime == date_without_timezone)

Esto resultará en el siguiente error:

TypeError: can't compare offset-naive and offset-aware datetimes

Entonces, para comparar objetos de fecha y hora, ambos objetos deben ser ingenuos o conscientes.

Conclusión

En este artículo, hemos discutido las formas de comparar fechas que reconocen la zona horaria y las fechas ingenuas de la zona horaria en Python, también hemos analizado los posibles errores que podemos encontrar al comparar fechas y posibles soluciones.

Si tiene alguna pregunta o contribución, déjela en la sección de comentarios a continuación.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad