Obtenha o dia da semana ou do mês a partir de uma data em Python como um fio (por exemplo, alemão ou inglês)

O negócio

Usando a data/hora padrão da biblioteca Python, pode criar um objecto de data/hora a partir de uma cadeia de datas e obter o nome do dia da semana ou mês a partir dela como uma cadeia. Contudo, a língua dessas cordas depende do local (país ou região) do ambiente.

Aqui estão duas maneiras de obter o nome do dia da semana ou do mês a partir de uma data como um fio em qualquer língua.

  • Alterar o locale com o módulo locale
  • Definir uma nova função

Para mais informações sobre a utilização básica do módulo datetime e os métodos strptime() e strftime() para conversão entre data e hora (data, hora) e strings, consultar os artigos seguintes.

Mudança de locale com módulo locale

A biblioteca padrão Python fornece um módulo de locale para controlar as configurações do locale.

Depende do ambiente, mas no ambiente de exemplo, utilizando o seguinte código de formatação no método strftime(), os nomes dos dias da semana e dos meses podem ser obtidos em notação inglesa.
%A, %a, %B, %b

O exemplo seguinte utiliza um objecto de data e hora para representar data e hora (data e hora), mas o mesmo se aplica a um objecto de data que só tem informação de data.

import datetime
import locale

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

print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan

LC_TIME, o locale category setting for time formatting, é verificado com locale.getlocale(), e está definido para None. Este resultado depende do ambiente.

print(locale.getlocale(locale.LC_TIME))
# (None, None)

LC_TIME para japonês (UTF-8) ja_JP.UTF-8 em locale.setlocale() para obter os nomes do dia e do mês em japonês. locale.LC_ALL pode ser usado para definir todas as categorias de locale, mas note que isto afectará, por exemplo LC_MONETARY, por exemplo.

Note-se que estas alterações só são efectivas neste código. Isto não significa que as variáveis de ambiente do sistema serão reescritas.

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(locale.getlocale(locale.LC_TIME))
# ('ja_JP', 'UTF-8')

print(dt.strftime('%A, %a, %B, %b'))
# 月曜日, 月, 1月,  1

Também pode alterar as definições do locale para utilizar notações noutras línguas, tais como inglês ou alemão.

locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan

locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Montag, Mo, Januar, Jan

Se quiser obter o dia da semana para uma determinada data a partir de uma cadeia de datas em qualquer língua, pode fazê-lo seguindo os passos abaixo.

  • LC_TIME para o valor da definição da língua desejada (por exemplo ja_JP.UTF-8) em locale.setlocale()
  • Conversão de uma cadeia de caracteres para um objecto de data/hora com strptime()
  • Chamar strftime() nesse objecto de data/hora com o seguinte código de formatação: %A, %a, %B, %b
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')

s = '2018-01-01'
s_dow = datetime.datetime.strptime(s, '%Y-%m-%d').strftime('%A')

print(s_dow)
# 月曜日

Definir uma nova função

Isto pode ser conseguido através da definição de uma nova função.

O método do dia da semana() do objecto datetime dá um valor inteiro de 0 para segunda-feira e 6 para domingo.

import datetime

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

print(dt.weekday())
# 0

print(type(dt.weekday()))
# <class 'int'>

Existe um método semelhante, isoweekday(), que retorna um valor inteiro de 1 para segunda-feira e 7 para domingo. Note-se que existe uma diferença subtil.

print(dt.isoweekday())
# 1

print(type(dt.isoweekday()))
# <class 'int'>

Se definirmos uma lista de nomes dos dias da semana para cada cadeia linguística e os recuperarmos utilizando os valores inteiros obtidos pelo método do dia da semana(), podemos alcançar o nosso objectivo.

Copied title and URL