Creación y análisis de fecha y hora en Python con Delorean

En esta guía, veremos cómo crear y analizar objetos de fecha y hora en Python con Delorean, desde varios formatos de cadena, marcas de tiempo de época y cómo generar una secuencia de fechas usando paradas ().

Introducción

Trabajar con datetime puede ser un poco desalentador y desafiante, y manejar datetime en Python no es una excepción. El módulo datetime incorporado de Python nos presentó varias clases: date, datetime, time, timezone y timedelta, y se han generado varias bibliotecas externas para abordar los problemas presentes en el módulo oficial, como Flecha.

En esta guía, veremos cómo crear y analizar objetos de fecha y hora en Delorean, una biblioteca basada en pytz, que es la biblioteca estándar para resolver problemas relacionados con las zonas horarias, y dateutil, que se utiliza para calcular deltas entre 2 fechas y horas dadas. objetos.

Instalación de Delorean Configuración de un entorno virtual

Delorean está disponible para su instalación a través de pip. En general, es recomendable trabajar en un entorno virtual porque te permite organizar las dependencias que requieren los diferentes proyectos de forma aislada.

En Linux o MacOS para crear un entorno virtual, ejecutaríamos:

1
2
3
$ python3 -m venv env
$ source env/bin/activate
$ python3 -m pip install delorean

Alternativamente, en Windows podemos ejecutar:

1
2
3
$ virtualenv env
$ .\env\Scripts\activate
$ python3 -m pip install delorean

Crear un objeto de fecha y hora de Delorean

La clase principal con la que trabajaremos, que representa todos los objetos datetime, es la clase Delorean(). Avancemos e importémoslo desde el módulo delorean e instanciamos un objeto de fecha y hora:

1
2
3
4
from delorean import Delorean

dt_tm = Delorean() 
print("Datetime: ", dt_tm)

Después de ejecutar el código, debería ver lo siguiente en su terminal/línea de comando:

1
Datetime:  Delorean(datetime=datetime.datetime(2021, 7, 11, 18, 40, 43, 760187), timezone='UTC')

Como de costumbre, es un envoltorio para el objeto datetime estándar, que se encuentra dentro del objeto Delorean que se le ha asignado. La zona horaria predeterminada es 'UTC', sin embargo, puede cambiarla fácilmente ya sea definiendo la zona horaria mientras instancia el objeto o cambiando la hora a una zona horaria diferente.

Dado que la salida es un poco difícil de analizar para los humanos, tiene sentido extraer algunos de los datos del contenedor para que sea más fácil de interpretar. Si bien la jerarquía descendente del tiempo es clara, lleva demasiado tiempo atravesarla y analizarla con nuestros ojos. Obtengamos la fecha de este objeto e imprimamos solo eso:

1
2
3
4
5
from delorean import Delorean 
dt_tm = Delorean()

dt = Delorean().date
print("Date: ", dt)

Esto resulta en:

1
Date:  2021-07-11

Si está interesado solo en la hora, sin tener mucho en cuenta la fecha en sí, puede obtener la hora consciente de la zona horaria, así como la hora ingenua de la zona horaria con bastante facilidad:

1
2
3
4
5
6
7
8
from delorean import Delorean
dt_tm = Delorean()

tm = dt_tm.datetime.time()
print("Timezone-aware time: ", tm)

naive_dt_tm = dt_tm.naive
print("Timezone-naive datetime: ", naive_dt_tm)

Esto resulta en:

1
2
Timezone-aware time:  18:40:21.235708
Timezone-naive datetime:  2021-07-11 18:40:21.235708

Para cambiar la zona horaria, la proporcionamos a la llamada del constructor o cambiamos la hora:

1
2
3
4
5
6
7
from delorean import Delorean

dt_tm = Delorean(timezone='Europe/Paris')
print("Datetime Object: ", dt_tm)
print("Time: ", dt_tm.datetime.time())
dt_tm.shift('US/Pacific')
print("Shifted time: ", dt_tm.datetime.time())
1
2
3
Datetime Object:  Delorean(datetime=datetime.datetime(2021, 7, 11, 20, 43, 26, 990117), timezone='Europe/Paris')
Time:  20:43:26.990117
Shifted time:  11:43:26.990117

Para echar un vistazo a todas las zonas horarias disponibles, ya que Delorean usa pytz debajo del capó, simplemente podemos imprimirlas:

1
2
3
4
5
6
7
8
import pytz

timezones = pytz.all_timezones
num = len(timezones)
print(f"There are {num} timezones: \n")

for tz in pytz.all_timezones:
    print(tz)

Lo que resulta en:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
There are 593 timezones: 

Africa/Abidjan
Africa/Accra
...
US/Michigan
US/Mountain
UTC
Universal
W-SU
WET
Zulu

Convertir cadena en objeto de fecha y hora de Delorean

Ninguna biblioteca estaría completa sin la capacidad de analizar cadenas en objetos de fecha y hora. Delorean es versátil con los formatos de cadena y asume que el día llega primero si hay alguna ambigüedad en la cadena analizada. El método parse() se usa para analizar una cadena, y opcionalmente acepta información de la zona horaria; de lo contrario, se asume 'UTC':

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import delorean

# Datetime strings of differing formats
datetime_strings = ["Mon May 12 2021 00:01:02", 
                    "25-12-2021", "8/6/2019", 
                    "15-12-1987 7:00:32", 
                    "June 5th, 2021", 
                    "5th of April, 2012", 
                    "Thu 13 of July"]

for date in datetime_strings:
    delorean_object = delorean.parse(date)
    print(delorean_object)

Ejecutar este código da como resultado:

1
2
3
4
5
6
7
Delorean(datetime=datetime.datetime(2021, 5, 12, 0, 1, 2), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 12, 25, 0, 0), timezone='UTC')
Delorean(datetime=datetime.datetime(2019, 6, 8, 0, 0), timezone='UTC')
Delorean(datetime=datetime.datetime(1987, 12, 15, 7, 0, 32), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 6, 5, 0, 0), timezone='UTC')
Delorean(datetime=datetime.datetime(2012, 4, 5, 0, 0), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 7, 13, 0, 0), timezone='UTC')

Puede notar cómo en el caso ambiguo de 8/6/2019, se asumió que el día viene primero, por lo tanto, se analizó como el 8 de junio, en lugar del 6 de agosto. Además, dado que no proporcionamos el año de la fecha final, se asigna automáticamente al año actual.

Si desea cambiar este comportamiento, puede establecer el argumento dayfirst en False. Además, también puede establecer el argumento yearfirst en True, que es False de forma predeterminada, en cuyo caso, el primer valor esperado será el año:

1
2
delorean_object = delorean.parse("8/6/2019", dayfirst=False)
print(delorean_object)

Esto resulta en:

1
Delorean(datetime=datetime.datetime(2019, 8, 6, 0, 0), timezone='UTC')

Marca de tiempo de época para objeto Delorean

Dado que todas las computadoras modernas adoptaron el uso de UNIX time, también conocido como Epoch time, no hace falta decir que podemos convertir una marca de tiempo UNIX/Epoch en un objeto Delorean. Este es el mecanismo subyacente que permite trabajar con el tiempo de todos modos. Para convertir una marca de tiempo de Unix en un objeto de fecha y hora de Delorean, usamos el método epoch() del módulo delorean:

1
2
3
4
5
import delorean

timestamp = 3141592653
delorean_object = delorean.epoch(timestamp)
print(delorean_object)

Hemos utilizado discretamente los primeros 10 dígitos de Pi para formar una marca de tiempo en el futuro, lo que resulta en un tiempo mucho más allá del de esta guía:

1
Delorean(datetime=datetime.datetime(2069, 7, 21, 0, 37, 33), timezone='UTC')

Generación de una secuencia de fechas

Una excelente forma de producir una secuencia de objetos Delorean es a través del generador stops(). Puede generar N fechas siguiendo un patrón, como todos los martes, cada hora o cada 10 semanas. Esto es útil para crear, por ejemplo, planes de pago mensuales o calcular planes de ROI, por ejemplo.

Con este enfoque, también puede generar una serie de fechas en las que debería ocurrir algo, como ejecutar un script todas las semanas a la misma hora, para recopilar datos de una aplicación para la agregación. Aunque también puedes usar la librería python-crontab para eso, o la subyacente [herramienta de utilidad crontab](/como-usar-el-comando-crontab- en-unix/) en su lugar.

El generador stops() acepta un argumento freq, que denota la frecuencia, una timezone y un count, que indica cuántas fechas debe generar. La frecuencia se puede establecer en cualquier constante Delorean válida: SEGUNDO, MINUTO, HORARIO, DIARIO, SEMANAL, MENSUAL o ANUAL:

1
2
3
4
import delorean

for stop in delorean.stops(freq=delorean.HOURLY, timezone='UTC', count=10):
    print(stop)

Esto genera una secuencia de objetos de fecha y hora siguiendo este patrón:

1
2
3
4
5
Delorean(datetime=datetime.datetime(2021, 7, 12, 13, 35, 12), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 7, 12, 14, 35, 12), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 7, 12, 15, 35, 12), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 7, 12, 16, 35, 12), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 7, 12, 17, 35, 12), timezone='UTC')

Si no está seguro de cuántos objetos de fecha y hora desea exactamente pero tiene una fecha y hora objetivo en mente, también puede configurarlo para que se repita hasta que ocurra una fecha determinada:

1
2
3
4
5
6
7
import  delorean

dt1 = delorean.Delorean().naive
dt2 = delorean.Delorean(datetime=datetime.datetime(2022, 1, 1), timezone='UTC').naive

for stop in delorean.stops(freq=delorean.MONTHLY, start=dt1, stop=dt2):
    print(stop)

Nota: El método stops() solo acepta instancias de fecha y hora timezone-naive para los argumentos start y stop, y devuelve fechas timezone-aware. Pero también requiere que especifiques una “zona horaria” al crear una instancia de “Delorean” usando el constructor. Lo que nos queda es: definir una “zona horaria” para la instancia y luego usar la fecha y hora “ingenua” para ambos en su lugar.

Ejecutar este código nos dará una fecha para cada mes hasta que llegue el primero de enero de 2022:

1
2
3
4
5
6
Delorean(datetime=datetime.datetime(2021, 7, 12, 13, 46, 1), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 8, 12, 13, 46, 1), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 9, 12, 13, 46, 1), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 10, 12, 13, 46, 1), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 11, 12, 13, 46, 1), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 12, 12, 13, 46, 1), timezone='UTC')

Conclusión

En esta guía, hemos echado un vistazo a cómo crear y analizar objetos de Delorean en Python. Hemos visto cómo convertir una cadena a fecha y hora en varios formatos, cómo convertir una marca de tiempo de época en fecha y hora, y cómo generar una secuencia de fechas usando el generador stops().

Licensed under CC BY-NC-SA 4.0