Uzyskaj dzień tygodnia lub miesiąca z daty w Pythonie jako ciąg znaków (np. niemiecki lub angielski)

Biznes

Używając standardowej biblioteki Pythona datetime, można utworzyć obiekt datetime z łańcucha daty i uzyskać z niego nazwę dnia tygodnia lub miesiąca w postaci ciągu znaków. Jednak język tych łańcuchów zależy od locale (ustawienia kraju lub regionu) środowiska.

Oto dwa sposoby, aby uzyskać nazwę dnia tygodnia lub miesiąca z daty jako ciąg znaków w dowolnym języku.

  • Zmień locale za pomocą modułu locale
  • Zdefiniuj nową funkcję

Więcej informacji na temat podstawowego użycia modułu datetime oraz metod strptime() i strftime() do konwersji pomiędzy datą i czasem (date, time) oraz łańcuchami znaków, znajdziesz w następujących artykułach.

Zmień locale za pomocą modułu locale

Biblioteka standardowa Pythona udostępnia moduł locale do kontroli ustawień locale.

Zależy to od środowiska, ale w przykładowym środowisku, używając poniższego kodu formatującego w metodzie strftime(), można uzyskać nazwy dni tygodnia i miesięcy w notacji angielskiej.
%A, %a, %B, %b

Poniższy przykład wykorzystuje obiekt datetime do reprezentacji daty i czasu (data i czas), lecz to samo jest prawdziwe dla obiektu date, który posiada tylko informację o dacie.

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, ustawienie kategorii locale dla formatowania czasu, jest sprawdzane za pomocą locale.getlocale() i jest ustawiane na None. Wynik ten zależy od środowiska.

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

LC_TIME na japońskie (UTF-8) ja_JP.UTF-8 w locale.setlocale(), aby uzyskać nazwy dni i miesięcy w języku japońskim. locale.LC_ALL może być użyte do ustawienia wszystkich kategorii locale, ale zauważ, że wpłynie to na, na przykład, LC_MONETARY.

Zwróć uwagę, że zmiany te obowiązują tylko w tym kodzie. Nie oznacza to, że systemowe zmienne środowiskowe zostaną przepisane.

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

Można również zmienić ustawienia locale, aby używać innych notacji językowych, takich jak angielski lub niemiecki.

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

Jeśli chcesz uzyskać dzień tygodnia dla danej daty z łańcucha daty w dowolnym języku, możesz to zrobić, wykonując poniższe kroki.

  • LC_TIME do wartości żądanego ustawienia języka (np. ja_JP.UTF-8) w locale.setlocale()
  • Konwersja ciągu znaków na obiekt datetime za pomocą strptime()
  • Wywołaj funkcję strftime() na tym obiekcie datetime z następującym kodem formatującym: %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)
# 月曜日

Zdefiniuj nową funkcję

Można to osiągnąć poprzez zdefiniowanie nowej funkcji.

Metoda weekday() obiektu datetime daje wartość całkowitą 0 dla poniedziałku i 6 dla niedzieli.

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

Istnieje podobna metoda, isoweekday(), która zwraca wartość całkowitą 1 dla poniedziałku i 7 dla niedzieli. Zauważ, że jest pewna subtelna różnica.

print(dt.isoweekday())
# 1

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

Jeśli zdefiniujemy listę nazw dni tygodnia dla każdego łańcucha językowego i pobierzemy je za pomocą wartości całkowitych uzyskanych przez metodę weekday(), możemy osiągnąć nasz cel.

Copied title and URL