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:
from datetime import datetime
Creación de una fecha utilizando el año, el mes y el día como argumentos.
datetime(year, month, day hour, minute, seconds)
birthday = datetime(1994, 2, 15, 4, 25, 12)
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í
birthday
datetime.datetime(1994, 2, 15, 4, 25, 12)
birthday.year
1994
birthday.month
2
birthday.day
15
Como puedes ver, es muy fácil crear una fecha usando este módulo. Ahora podemos hacer otras cosas interesantes, como:
birthday.weekday()
1
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
datetime.now()
datetime.datetime(2021, 2, 5, 8, 5, 24, 147641)
Ok, eso es interesante. ¿Qué pasa si ejecutas ese comando de nuevo? Sigue adelante y ve la diferencia
datetime.now()
datetime.datetime(2021, 2, 5, 8, 5, 46, 947275)
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
# time tracking operation
datetime(2018, 1, 1) - datetime(2017, 1, 1)
datetime.timedelta(365)
datetime(2018, 1, 1) - datetime(2017, 1, 12)
datetime.timedelta(354)
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.
datetime.now() - datetime(2020, 1, 1)
datetime.timedelta(401, 29241, 371294)
Excelente ahora usamos el método .now()
y restamos la fecha que queremos calcular. Fácil.
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:
parsed_date = datetime.strptime('Nov 15, 2020', '%b %d, %Y')
parsed_date
datetime.datetime(2020, 11, 15, 0, 0)
type(parsed_date)
datetime.datetime
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:
Ya hemos parseado nuestra fecha en la variable parsed_date
, ahora vamos a empezar a hacer llamadas a los métodos que contiene.
parsed_date.month
11
parsed_date.year
2020
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í:
date_string = datetime.strftime(datetime.now(), '%b %d, %Y')
date_string
'Feb 05, 2021'
Como puedes ver, pasamos datetime.now()
como primer argumento y luego las directivas de los formatos en los que queremos la salida. ¡Realmente sencillo!
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
.
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:
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.
from datetime import time
my_time = time(hour=12, minute=34, second=56, microsecond=123456)
my_time
datetime.time(12, 34, 56, 123456)
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
.
my_time.isoformat(timespec='minutes')
'12:34'
my_time.isoformat(timespec='microseconds')
'12:34:56.123456'
my_time.isoformat(timespec='auto')
'12:34:56.123456'
my_time.isoformat()
'12:34:56.123456'
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
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
from datetime import timedelta
year = timedelta(days=365)
year
datetime.timedelta(365)
year.total_seconds()
31536000.0
ten_years = 10 * year
ten_years.total_seconds()
315360000.0
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
another_year = timedelta(weeks=40, days=84, hours=23,
minutes=50, seconds=600) # adds up to 365 days
another_year
datetime.timedelta(365)
year == another_year
True
Ahora hemos hecho una operación booleana
, donde preguntamos si un timedelta
es igual a otro. Para lo cual obtenemos un True
.
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!