Conversión de fechas y horas a y desde cadenas en Python datetime (strftime, strptime)

Negocio

La biblioteca estándar de Python datetime puede utilizarse para procesar fechas y horas (fechas, horas y tiempos). Los métodos strftime() y strptime(), que convierten fechas y horas a y desde cadenas, pueden utilizarse para manipular fechas y horas en una variedad de formatos.

También puede realizar operaciones como la resta y la suma. Por ejemplo, puede calcular y obtener fácilmente la fecha de hace 10 días o de dentro de 3 semanas, o la hora de dentro de 50 minutos.

En primer lugar, describiremos las siguientes clases de objetos disponibles en el módulo datetime.

  • datetime.datetime:Fecha y hora (fecha y hora)
  • datetime.date:Fecha
  • datetime.time:Tiempo
  • datetime.timedelta:Diferencia de tiempo y tiempo transcurrido

También se explican los métodos strftime() y strptime(), que convierten date\time y string entre sí.

  • datetimeobjeto
    • datetime.now():Fecha de hoy, hora actual
    • datetimeConstructor de objetos
    • Convertir un objeto datetime en un objeto date
  • dateobjeto
    • date.today():La fecha de hoy
    • Constructor del objeto fecha
  • timeobjeto
    • Constructor del objeto tiempo
  • timedeltaobjeto
    • Resta los objetos datetime y date para crear objetos timedelta.
    • Constructor del objeto timedelta
    • Restas y sumas con objetos timedelta
  • strftime():Conversión de fecha y hora a cadena
  • strptime():Conversión de cadena a fecha y hora

También se incluye en la biblioteca estándar el módulo de calendario, que genera calendarios en formato de texto plano o HTML.

objeto datetime

Un objeto datetime es un objeto que tiene información tanto de fecha (año, mes, día) como de hora (hora, minuto, segundo, microsegundo). Puedes acceder a esa información con los siguientes atributos.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now(): Fecha de hoy, hora actual

datetime.now() le dará un objeto datetime con la fecha de hoy (la fecha actual) y la hora actual.

import datetime

dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231

print(type(dt_now))
# <class 'datetime.datetime'>

print(dt_now.year)
# 2018

print(dt_now.hour)
# 18

Constructor del objeto datetime

También es posible generar objetos datetime para fechas y horas arbitrarias.

El constructor del objeto datetime es el siguiente.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Los siguientes valores son obligatorios y los demás pueden omitirse. Si se omiten, el valor por defecto es 0.

  • year
  • month
  • day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000

print(dt.minute)
# 15

print(dt.microsecond)
# 2000

dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00

print(dt.minute)
# 0

Convertir un objeto datetime en un objeto date

Un objeto datetime puede convertirse en un objeto date mediante el método date(), como se describe a continuación.

print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>

print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>

objeto de la fecha

Un objeto fecha es un objeto que contiene información sobre una fecha (año, mes, día). Se puede acceder a él por los atributos año, mes y día.

date.today(): La fecha de hoy

El objeto fecha de la fecha actual (fecha de hoy) se puede obtener con date.today().

d_today = datetime.date.today()
print(d_today)
# 2018-02-02

print(type(d_today))
# <class 'datetime.date'>

print(d_today.year)
# 2018

Constructor del objeto fecha

El constructor del objeto fecha es el siguiente

date(year, month, day)

Todos son obligatorios y no pueden omitirse.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

objeto de tiempo

El objeto hora es un objeto que contiene información sobre el tiempo (horas, minutos, segundos y microsegundos). Se puede acceder a él utilizando los atributos hora, minuto, segundo y microsegundo.

Constructor del objeto tiempo

El constructor del objeto tiempo es el siguiente.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Todos ellos son opcionales, y si se omiten, se ponen a 0.

t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000

print(type(t))
# <class 'datetime.time'>

print(t.hour)
# 12

t = datetime.time()
print(t)
# 00:00:00

objeto timedelta

El objeto timedelta es un objeto que representa la diferencia de tiempo entre dos fechas y horas, o el tiempo transcurrido. Tiene información en días, segundos y microsegundos, y se puede acceder a él mediante los atributos days, seconds y microseconds. También es posible obtener el número total de segundos utilizando el método total_seconds().

Resta los objetos datetime y date para crear el objeto timedelta.

Al restar los objetos datetime entre sí se obtiene un objeto timedelta.

td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231

print(type(td))
# <class 'datetime.timedelta'>

print(td.days)
# 1

print(td.seconds)
# 66673

print(td.microseconds)
# 271231

print(td.total_seconds())
# 153073.271231

La sustracción de los objetos de fecha entre sí da como resultado un objeto timedelta.

Constructor del objeto timedelta

El constructor del objeto timedelta es el siguiente

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Todos ellos son opcionales, y si se omiten, se ponen a 0.

Tenga en cuenta que el objeto timedelta sólo contiene la siguiente información.

  • un número de días: days
  • número de segundos: seconds
  • recuento de microsegundos: microseconds

Por ejemplo, los dos siguientes son iguales

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

Restas y sumas con objetos timedelta

El objeto timedelta puede utilizarse con los objetos datetime y date para realizar operaciones como la resta y la suma. Por ejemplo, puede calcular y obtener fácilmente la fecha de hace una semana o de dentro de 10 días, o la hora de dentro de 50 minutos.

d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26

td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00

dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231

td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00

print(td_50m.seconds)
# 3000

dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231

También puede utilizarse para calcular el número de días que faltan para una fecha determinada.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime(): Conversión de fecha y hora a cadena

El método strftime() de los objetos datetime y date puede utilizarse para convertir la información de fecha y hora en una cadena con cualquier formato.

código de formato

Consulte la documentación oficial más abajo para conocer los códigos de formato disponibles.

A continuación se enumeran los principales códigos de formato.

  • %d:Día del mes en notación decimal con el cero relleno.
  • %m:Mes en notación decimal con el cero relleno.
  • %y:Los dos últimos dígitos del año en notación decimal llena de ceros.
  • %Y:Cuatro dígitos del año en notación decimal con el cero relleno.
  • %H:Cuando se expresa en notación decimal con el cero relleno (notación de 24 horas)
  • %I:Cuando se expresa en notación decimal con el cero relleno (notación de 12 horas)
  • %M:Para la notación decimal con relleno de cero.
  • %S:Segundos en notación decimal con relleno de cero.
  • %f:Microsegundos (6 dígitos) en notación decimal con el 0 relleno.
  • %A:Nombre del día de la semana para la localidad
  • %a:Nombre del día de la localidad (forma abreviada)
  • %B:Nombre del mes de la localidad
  • %b:Nombre del mes de la localidad (forma abreviada)
  • %j:Día del año en notación decimal con relleno cero.
  • %U:Número de la semana del año en notación decimal con relleno cero (la semana comienza en domingo)
  • %W:Número de la semana del año en notación decimal con relleno cero (la semana comienza el lunes)

Los siguientes códigos de formato para los nombres de los días y los meses pueden obtenerse en diferentes cadenas dependiendo de la configuración regional.

  • %A
  • %a
  • %B
  • %b

También existe un método específico para las cadenas con formato ISO 8601.

Código de muestra

print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13

print(d_today.strftime('%y%m%d'))
# 180202

print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018

print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05

Si quieres obtener un número en lugar de una cadena, sólo tienes que convertirlo en un entero con int().

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

En combinación con el objeto timedelta, es fácil crear, por ejemplo, una lista de fechas quincenales en cualquier formato.

d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'

l = []

for i in range(n):
    l.append((d + i * td).strftime(f))

print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10

Utilizar la notación de comprensión de la lista es más inteligente.

l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

strptime(): Conversión de cadena a fecha y hora

datetime strptime() puede utilizarse para crear un objeto datetime a partir de una cadena de fecha u hora. Es necesario especificar la cadena de formato correspondiente a la cadena original.

También hay un método dedicado a las cadenas ISO 8601 (Python 3.7 o posterior).

Código de muestra

date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00

print(type(date_dt))
# <class 'datetime.datetime'>

Utilizando el método strftime() en el objeto datetime recuperado, puede representar la fecha y la hora en un formato diferente al de la cadena original.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

Si lo conviertes en un objeto datetime, también puedes realizar operaciones con objetos timedelta, así por ejemplo, puedes generar una cadena de una fecha de hace 10 días en el mismo formato.

date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)

date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)

print(date_str_new)
# 2018-01-22