Converter datas e horas a e dende cadeas en Python datetime (strftime, strptime)

Negocios

A datatime da biblioteca estándar de Python pódese usar para procesar datas e horas (datas, horas e horas). Os métodos strftime() e strptime(), que converten datas e horas en e dende cadeas, pódense usar para manipular datas e horas nunha variedade de formatos.

Tamén pode realizar operacións como a resta e a suma. Por exemplo, pode calcular e obter facilmente a data hai 10 días ou dentro de 3 semanas, ou a hora dentro de 50 minutos.

En primeiro lugar, describiremos as seguintes clases de obxectos dispoñibles no módulo datetime.

  • datetime.datetime:Data e hora (data e hora)
  • datetime.date:Data
  • datetime.time:Tempo
  • datetime.timedelta:Diferenza horaria e tempo transcorrido

Tamén se explican os métodos strftime() e strptime(), que converten data/hora e cadea entre si.

  • datetimeobxecto
    • datetime.now():Data de hoxe, hora actual
    • datetimeConstrutor de obxectos
    • Converter un obxecto de data e hora nun obxecto de data
  • dateobxecto
    • date.today():Data de hoxe
    • Construtor para o obxecto de data
  • timeobxecto
    • Construtor para o obxecto tempo
  • timedeltaobxecto
    • Resta obxectos de data e hora para crear obxectos timedelta.
    • Construtor para o obxecto timedelta
    • Resta e suma mediante obxectos timedelta
  • strftime():Conversión de data e hora a cadea
  • strptime():Conversión de cadea a data e hora

Tamén se inclúe na biblioteca estándar o módulo de calendario, que xera calendarios en texto plano ou formato HTML.

obxecto datetime

Un obxecto de data e hora é un obxecto que ten información tanto de data (ano, mes, día) como de hora (hora, minuto, segundo, microsegundos). Podes acceder a esa información cos seguintes atributos.

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

datetime.now():Data de hoxe, hora actual

datetime.now() darache un obxecto datetime coa data de hoxe (a data actual) e a 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

Construtor para o obxecto datetime

Tamén é posible xerar obxectos de data e hora para datas e horas arbitrarias.

O construtor para o obxecto datetime é o seguinte.

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

Os seguintes valores son obrigatorios e pódense omitir outros. Se se omite, o valor predeterminado é 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

Converter un obxecto de data e hora nun obxecto de data

Un obxecto de data e hora pódese converter nun obxecto de data co 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'>

obxecto de data

Un obxecto data é un obxecto que contén información sobre unha data (ano, mes, día). Pódese acceder polos atributos ano, mes e día.

date.today():Data de hoxe

O obxecto da data da data actual (a data de hoxe) pódese obter 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

Construtor para o obxecto de data

O construtor para o obxecto de data é o seguinte

date(year, month, day)

Todos son obrigatorios e non se poden omitir.

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

print(d.month)
# 2

obxecto temporal

O obxecto tempo é un obxecto que contén información sobre o tempo (horas, minutos, segundos e microsegundos). Pódese acceder mediante os atributos hora, minuto, segundo e microsegundo.

Construtor para o obxecto tempo

O construtor do obxecto tempo é o seguinte.

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

Todos eles son opcionais e, se se omiten, establécense en 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

obxecto timedelta

O obxecto timedelta é un obxecto que representa a diferenza horaria entre dúas datas e horas, ou o tempo transcorrido. Ten información en días, segundos e microsegundos, e pódese acceder mediante os atributos días, segundos e microsegundos. Tamén é posible obter o número total de segundos usando o método total_seconds().

Resta os obxectos de data e hora para crear un obxecto timedelta.

Ao restar obxectos de data e hora entre si, obtén un obxecto 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

A resta de obxectos de data uns doutros produce de forma similar un obxecto timedelta.

Construtor para o obxecto timedelta

O construtor do obxecto timedelta é o seguinte

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

Todos eles son opcionais e, se se omiten, establécense en 0.

Teña en conta que o obxecto timedelta só contén a seguinte información.

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

Por exemplo, os dous seguintes son iguais

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

print(td_1w.days)
# 7

Resta e suma mediante obxectos timedelta

O obxecto timedelta pódese usar cos obxectos datatime e data para realizar operacións como a resta e a suma. Por exemplo, pode calcular e obter facilmente a data hai unha semana ou dentro de 10 días, ou a hora 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

Tamén se pode usar para calcular o número de días ata unha data específica.

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 data e hora a cadea

O método strftime() dos obxectos datetime e data pódese usar para converter a información de data e hora (data e hora) nunha cadea en calquera formato.

código de formato

Consulte a documentación oficial a continuación para coñecer os códigos de formato dispoñibles.

Os principais códigos de formato están listados a continuación.

  • %d:Día do mes en notación decimal con cero cuberto.
  • %m:Mes en notación decimal con cero cuberto.
  • %y:Os dous últimos díxitos do ano en notación decimal completada con cero.
  • %Y:Catro díxitos do ano en notación decimal con cero cuberto.
  • %H:Cando se expresa en notación decimal con cero (notación de 24 horas)
  • %I:Cando se expresa en notación decimal con cero (notación de 12 horas)
  • %M:Para notación decimal con cero cuberto.
  • %S:Segundos en notación decimal con cero cuberto.
  • %f:Microsegundos (6 díxitos) en notación decimal con 0 cuberto.
  • %A:Nome do día da semana da localidade
  • %a:Nome do día da localidade (forma abreviada)
  • %B:Nome do mes da localidade
  • %b:Nome local do mes (forma abreviada)
  • %j:Día do ano en notación decimal con recheo de cero.
  • %U:Número da semana do ano en notación decimal con recheo de cero (a semana comeza o domingo)
  • %W:Número da semana do ano en notación decimal con recheo de cero (a semana comeza o luns)

Os seguintes códigos de formato para os nomes de días e meses pódense obter en cadeas diferentes dependendo da configuración rexional.

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

Tamén hai un método dedicado para as cadeas de formato ISO 8601.

Código de mostra

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

Se queres obter un número en lugar dunha cadea, só convérteo nun número enteiro 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 co obxecto timedelta, é fácil crear, por exemplo, unha lista de datas quincenais en calquera 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

Usar a notación de comprensión da lista é máis intelixente.

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 cadea a data e hora

datetime strptime() pódese usar para crear un obxecto de data e hora a partir dunha cadea de data ou hora. É necesario especificar a cadea de formato correspondente á cadea orixinal.

Tamén hai un método dedicado para cadeas ISO 8601 (Python 3.7 ou posterior).

Código de mostra

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'>

Usando o método strftime() no obxecto de data e hora recuperado, pode representar a data e a hora nun formato diferente ao da cadea orixinal.

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

Se o convertes nun obxecto de data e hora, tamén podes realizar operacións con obxectos de timedelta, polo que, por exemplo, podes xerar unha cadea dunha data de hai 10 días no mesmo 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