¿Cómo Usar Correctamente Los Datetimes En Python?

Datetime es básicamente un objeto python que representa un punto en el tiempo, como años, días, segundos, milisegundos. Esto es muy útil para crear nuestros programas.

El módulo datetime proporciona clases para manipular fechas y horas de forma simple y compleja. Mientras que la aritmética de la fecha y la hora está soportada, la aplicación se centra en la extracción eficiente de atributos para formatear y manipular la salida

Vamos a importar el módulo de Python

Puedes seguir este notebook viendo tambien este video:

Creación de una fecha utilizando el año, el mes y el día como argumentos.

datetime(year, month, day hour, minute, seconds)

Ahora, una vez que hemos creado el objeto y lo hemos asignado a la variable llamada birthday, podemos acceder a cada formato de fecha así

Como puedes ver, es muy fácil crear una fecha usando este módulo. Ahora podemos hacer otras cosas interesantes, como:

Esto significa que el cumpleaños fue un lunes, porque los días están en este formato (0-6), o lo que es lo mismo indexados como una lista (empezando por cero).

¿Pero qué pasa si quiero saber cuál es la fecha actual? En ese caso, podemos utilizar datetime.now(), y escribir esto en la siguiente celda

Ok, eso es interesante. ¿Qué pasa si ejecutas ese comando de nuevo? Sigue adelante y ve la diferencia

Como puedes ver la salida es ahora diferente, porque el tiempo cambió. Muy bien. Ahora puedes preguntarte, ¿cómo puedo calcular el tiempo de una fecha a otra? Eso se llama "time tracking", veamos cómo funciona

Ya ves lo fácil que es, podemos ejecutar operaciones aritméticas entre fechas, ¡lo cual es genial! Pero, ¿y si ahora quieres saber cuánto tiempo ha pasado desde una fecha determinada hasta hoy, en este mismo momento? ¿Cómo crees que se puede hacer eso? Piénsalo por un momento.

Excelente ahora usamos el método .now() y restamos la fecha que queremos calcular. Fácil.

Uso de strptime

Este método nos ayudará a transformar las fechas dadas en cadenas a un formato datetime, lo cual es bastante útil.

Veámoslo en acción:

Como vemos, hemos pasado dos parámetros al método strptime, el primero ha sido la cadena de la fecha, y el segundo la "directiva" en la que queremos hacer la conversión. Para ver todas las "directivas" disponibles, ve a el siguiente link:

Screenshot%20from%202021-02-05%2008-09-45.png

Screenshot%20from%202021-02-05%2008-09-58.png

Ya hemos parseado nuestra fecha en la variable parsed_date, ahora vamos a empezar a hacer llamadas a los métodos que contiene.

Usando strftime

Muy bien, ahora vamos a hacer la operación contraria, pasando un tipo datetime como parámetro a la función strftime y convirtiéndolo en una cadena. Lo hacemos así:

Como puedes ver, pasamos datetime.now() como primer argumento y luego las directivas de los formatos en los que queremos la salida. ¡Realmente sencillo!

Objeto Time

Un objeto time representa una hora del día (local), independiente de cualquier día en particular, y sujeta a ajustes a través de un objeto tzinfo.

Screenshot%20from%202021-02-05%2008-13-45.png

Todos los argumentos son opcionales. tzinfo puede ser None, o una instancia de una subclase de tzinfo. El resto de los argumentos pueden ser enteros, en los siguientes rangos:

Screenshot%20from%202021-02-05%2008-14-48.png

Si se da un argumento fuera de estos rangos, se produce un Value-Error.

Todos los valores por defecto son 0 excepto tzinfo, que por defecto es None. Es hora de jugar con este objeto.

Como podemos ver nos dará como resultado un objeto time. Sin embargo, tiene un formato no muy "amigable". Con el objeto time podemos utilizar el isoformat.

Podemos ver que hay varios formatos iso para mostrar la hora. Nosotros utilizamos diferentes formatos, y el que viene por defecto es auto, que podemos utilizar sin pasar un parámetro explícitamente. Estos son los fromatos posibles a usar

Screenshot%20from%202021-02-05%2008-17-21.png

Objeto timedelta

Un objeto timedelta representa una duración, la diferencia entre dos fechas u horas, lo cual es bastante útil. Veamos cómo funciona. Primero tenemos que importar timedelta y luego tenemos que llamar a las diferentes funciones incorporadas

Hemos pasado el parámetro days = 365 a timedelta y luego hemos llamado a dos funciones. Una de ellas devuelve el total de segundos que tienen los 365 días.Y la otra crea 10 años.

Hagamos otro cálculo

Ahora hemos hecho una operación booleana, donde preguntamos si un timedelta es igual a otro. Para lo cual obtenemos un True.

Métodos Naive y Aware

Hay dos tipos de objetos de fecha y hora: "ingenuo/naive" y "consciente/aware".

Un objeto "consciente" tiene suficiente conocimiento de las configuraciones horarias políticas y algorítmicas aplicables, como la información sobre la zona horaria y el ahorro de luz diurna, para poder posicionarse en relación con otros objetos "conscientes".

Un objeto "consciente" se utiliza para representar un momento específico en el tiempo que no está abierto a la interpretación. Ignora la relatividad

Un objeto "ingenuo" no contiene suficiente información para situarse inequívocamente en relación con otros objetos de fecha/hora

El hecho de que un objeto "naive" represente el Tiempo Universal Coordinado (UTC), la hora local o la hora de alguna otra zona horaria depende exclusivamente del programa, al igual que depende del programa el hecho de que un determinado número represente metros, millas o masa

Los objetos "ingenuos" son fáciles de entender y de trabajar, a costa de ignorar algunos aspectos de la realidad.

Esto finalmente nos sirve para trabajar los husos horarios, y los cambios de hora (dependiendo del verano-invierno) y las zonas americanas como por ejemplo EST o EDT

El soporte de las zonas horarias a niveles de detalle más profundos depende de la aplicación.

Las reglas de ajuste de la hora en todo el mundo son más políticas que racionales, cambian con frecuencia y no hay un estándar adecuado para todas las aplicaciones que no sea el UTC

Los objetos de este tipo son inmutables.

Los objetos de tipo fecha son siempre ingenuos.

Esto es todo por esta entrada, espero que haya disfrutado de esta lectura!