Conversão de datas e horas de e para cordas em Python datetime (strftime, strptime)

O negócio

A data e hora padrão da biblioteca Python pode ser utilizada para processar datas e horas (datas, horas e horas). Os métodos strftime() e strptime(), que convertem datas e horas de e para strings, podem ser usados para manipular datas e horas numa variedade de formatos.

Pode também realizar operações como a subtracção e a adição. Por exemplo, pode facilmente calcular e obter a data há 10 dias ou daqui a 3 semanas, ou o tempo daqui a 50 minutos.

Em primeiro lugar, descreveremos as seguintes classes de objectos disponíveis no módulo de data/hora.

  • datetime.datetime:Data e hora (data e hora)
  • datetime.date:Data
  • datetime.time:Hora
  • datetime.timedelta:Diferença horária e tempo decorrido

Os métodos strftime() e strptime(), que convertem data e string uns aos outros, também são explicados.

  • datetimeobjecto
    • datetime.now():A data de hoje, hora actual
    • datetimeConstrutor de objectos
    • Conversão de um objecto de data/hora para um objecto de data
  • dateobjecto
    • date.today():A data de hoje
    • Construtor para o objecto de data
  • timeobjecto
    • Construtor para o objecto do tempo
  • timedeltaobjecto
    • Subtrair data/hora e datar objectos para criar objectos com temporizador.
    • Construtor para o objecto timedelta
    • Subtracção e adição usando objectos de tempo
  • strftime():Conversão de data e hora para cadeia
  • strptime():Conversão de cordel para data e hora

Também incluído na biblioteca padrão está o módulo calendário, que gera calendários em texto simples ou em formato HTML.

objecto datetime

Um objecto de data/hora é um objecto que tem tanto informação de data (ano, mês, dia) como de hora (hora, minuto, segundo, microssegundo). É possível aceder a essas informações com os seguintes atributos.

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

datetime.now(): A data de hoje, hora actual

datetime.now() dar-lhe-á um objecto datetime com a data de hoje (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 objecto de data/hora

Também é possível gerar objectos de data e hora para datas e horas arbitrárias.

O construtor do objecto de data/hora é o seguinte.

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

São necessários os seguintes valores e outros podem ser omitidos. Se omitidos, o valor por defeito é 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

Conversão de um objecto de data/hora para um objecto de data

Um objecto datetime pode ser convertido para um objecto datetime pelo método date(), como descrito a seguir.

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

objecto de data

Um objecto de data é um objecto que contém informação sobre uma data (ano, mês, dia). Pode ser acedido pelos atributos ano, mês, e dia.

date.today(): A data de hoje

A data objecto da data actual (data de hoje) pode ser obtida com 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 objecto de data

O construtor para o objecto de data é o seguinte

date(year, month, day)

Todos são exigidos e não podem ser omitidos.

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

print(d.month)
# 2

objecto temporal

O objecto de tempo é um objecto que contém informação sobre o tempo (horas, minutos, segundos, e microssegundos). Pode ser acedido utilizando os atributos hora, minuto, segundo, e microssegundo.

Construtor para o objecto do tempo

O construtor do objecto do tempo é o seguinte.

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

Todos eles são opcionais, e se forem omitidos, são fixados em 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

objecto timedelta

O objecto com tempo é um objecto que representa a diferença de tempo entre duas datas e horas, ou o tempo decorrido. Tem informação em dias, segundos e microssegundos, e pode ser acedido pelos atributos dias, segundos, e microssegundos. Também é possível obter o número total de segundos usando o método total_seconds().

Subtrair data hora e datar objectos para criar objectos com data e hora limite.

Subtrair objectos de data e hora uns dos outros produz um objecto com tempo de duração.

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 subtracção de objectos de data uns dos outros produz de forma semelhante um objecto com a mesma duração.

Construtor para o objecto timedelta

O construtor do objecto timedelta é o seguinte

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

Todos eles são opcionais, e se forem omitidos, são fixados em 0.

Note-se que o objecto timedelta contém apenas as seguintes informações.

  • um certo número de dias: days
  • número de segundos: seconds
  • contagem de microssegundos: microseconds

Por exemplo, os dois seguintes são iguais

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

print(td_1w.days)
# 7

Subtracção e adição usando objectos de tempo

O objecto com data e hora pode ser utilizado com a data e os objectos com data para realizar operações tais como subtracção e adição. Por exemplo, pode facilmente calcular e obter a data há uma semana ou daqui a 10 dias, ou a hora daqui a 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

Também pode ser utilizado para calcular o número de dias até uma 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(): Conversão de data e hora para cadeia

O método strftime() de objectos de data e hora pode ser utilizado para converter informação de data e hora (data e hora) numa cadeia de caracteres em qualquer formato.

código de formatação

Ver a documentação oficial abaixo para os códigos de formatação disponíveis.

Os principais códigos de formatação estão listados abaixo.

  • %d:Dia do mês em notação decimal com zero preenchido.
  • %m:Mês em notação decimal com zero preenchido.
  • %y:Os dois últimos dígitos do ano em notação decimal preenchida a zero.
  • %Y:Quatro dígitos do ano em notação decimal com zero preenchido.
  • %H:Quando expresso em notação decimal com zero preenchido (notação de 24 horas)
  • %I:Quando expresso em notação decimal com zero preenchido (notação de 12 horas)
  • %M:Para notação decimal com zero preenchido.
  • %S:Segundos em notação decimal com zero preenchido.
  • %f:Microssegundos (6 dígitos) em notação decimal com 0 preenchido.
  • %A:Nome do dia da semana para o local
  • %a:Nome do dia para o locale (forma abreviada)
  • %B:Nome do mês local
  • %b:Nome do mês local (forma abreviada)
  • %j:Dia do ano em notação decimal com preenchimento zero.
  • %U:Número da semana do ano em notação decimal com preenchimento zero (a semana começa no domingo)
  • %W:Número da semana do ano em notação decimal com preenchimento zero (a semana começa na segunda-feira)

Os seguintes códigos de formatação para nomes de dia e mês podem ser obtidos em diferentes cordas, dependendo do local.

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

Há também um método dedicado para cordas de formato ISO 8601.

Código da amostra

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 quiser obter um número em vez de um fio, basta convertê-lo para um número inteiro com int().

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

Em combinação com o objecto timedelta, é fácil de criar, por exemplo, uma lista de datas quinzenais em qualquer 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

A utilização da notação de compreensão da lista é mais 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(): Conversão de cordel para data e hora

datetime strptime() pode ser usado para criar um objecto de data/hora a partir de uma cadeia de data ou hora. É necessário especificar a cadeia de formatação correspondente à cadeia de caracteres original.

Há também um método dedicado às cordas ISO 8601 (Python 3.7 ou posterior).

Código da amostra

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

Ao utilizar o método strftime() no objecto de data/hora recuperado, pode representar a data e a hora num formato diferente do da cadeia de caracteres original.

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

Se o converter num objecto com data e hora, também pode realizar operações com objectos com data e hora, por exemplo, pode gerar uma sequência de uma data há 10 dias atrás, 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
Copied title and URL