Získat den v týdnu nebo měsíci z data v jazyce Python jako řetězec (např. německý nebo anglický)

Podnikání

Pomocí standardní knihovny datetime jazyka Python můžete vytvořit objekt datetime z řetězce data a získat z něj název dne v týdnu nebo měsíce jako řetězec. Jazyk těchto řetězců však závisí na locale (nastavení země nebo regionu) prostředí.

Zde jsou dva způsoby, jak získat název dne v týdnu nebo měsíce z data jako řetězec v libovolném jazyce.

  • Změna locale pomocí modulu locale
  • Definice nové funkce

Další informace o základním použití modulu datetime a metod strptime() a strftime() pro převod mezi datem a časem (datum, čas) a řetězci naleznete v následujících článcích.

Změna locale pomocí modulu locale

Standardní knihovna Pythonu poskytuje modul locale pro ovládání nastavení locale.

Záleží na prostředí, ale v ukázkovém prostředí lze pomocí následujícího formátovacího kódu v metodě strftime() získat názvy dnů v týdnu a měsíců v anglickém zápisu.
%A, %a, %B, %b

Následující příklad používá objekt datetime k reprezentaci data a času (datum a čas), ale totéž platí i pro objekt date, který obsahuje pouze informace o datu.

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, nastavení kategorie locale pro formátování času, se kontroluje pomocí locale.getlocale() a je nastaveno na hodnotu None. Tento výsledek závisí na prostředí.

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

LC_TIME na japonštinu (UTF-8) ja_JP.UTF-8 v locale.setlocale() pro získání názvů dnů a měsíců v japonštině. locale.LC_ALL lze použít pro nastavení všech kategorií locale, ale upozorňujeme, že to ovlivní například LC_MONETARY, např.

Všimněte si, že tyto změny jsou účinné pouze v tomto kódu. Neznamená to, že budou přepsány systémové proměnné prostředí.

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

Nastavení místního jazyka můžete také změnit tak, aby se používaly jiné jazykové záznamy, například angličtina nebo němčina.

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

Pokud chcete získat den v týdnu pro dané datum z řetězce data v libovolném jazyce, můžete to provést podle následujících kroků.

  • LC_TIME na hodnotu požadovaného jazykového nastavení (např. ja_JP.UTF-8) v locale.setlocale()
  • Převod řetězce na objekt datetime pomocí funkce strptime()
  • Na tento objekt datetime zavolejte funkci strftime() s následujícím formátovacím kódem: %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)
# 月曜日

Definice nové funkce

Toho lze dosáhnout definováním nové funkce.

Metoda weekday() objektu datetime poskytuje celočíselnou hodnotu 0 pro pondělí a 6 pro neděli.

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

Existuje podobná metoda isoweekday(), která vrací celočíselnou hodnotu 1 pro pondělí a 7 pro neděli. Všimněte si, že je zde jemný rozdíl.

print(dt.isoweekday())
# 1

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

Pokud definujeme seznam názvů dnů v týdnu pro každý jazykový řetězec a získáme je pomocí celočíselných hodnot získaných metodou weekday(), můžeme dosáhnout našeho cíle.