![[小ネタ]Pythonの日付操作で一時的にロケールを変更する](https://devio2023-media.developers.io/wp-content/uploads/2019/04/python.png)
[小ネタ]Pythonの日付操作で一時的にロケールを変更する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
データアナリティクス事業本部のkobayashiです。
様々な国のデータを扱う機会があり、そこに含まれているデータの日付データの形式が国ごとに異っていました。その日付データをPythonスクリプトの日付型datetimeにする必要がありましたのでその方法をまとめます。
環境
- macOS Big Sur
- Python 3.8.10
localeモジュール
localeモジュールはPython標準ライブラリです。このモジュールはPythonでPOSIXロケールを扱う事ができるモジュールで、システムにインストールされているロケールを使って国に依存する書式設定を設定、取得が行なえます。
各国の日付データを扱う
Pythonスクリプト中でロケールを変更する際はlocale.setlocale()を使います。また現在使用しているロケールを取得するにはlocale.getlocale()を使います。
一つ注意点があるのですが、locale.setlocale()はスレッドセーフでないのでマルチスレッドで使用する場合は注意が必要です。
また使用できるロケールは環境により異なるので予め確認しておく必要があります。
システムのロケールを確認する
localeコマンドで現在のロケールを確認します。
$ locale LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_ALL=
次にインストールされているロケールを確認します。
$ locale -a en_NZ nl_NL.UTF-8 pt_BR.UTF-8 fr_CH.ISO8859-15 eu_ES.ISO8859-15 en_US.US-ASCII af_ZA bg_BG cs_CZ.UTF-8 fi_FI zh_CN.UTF-8 eu_ES sk_SK.ISO8859-2 nl_BE ....
ここで表示されたロケールがPythonスクリプト中でも使えますのでPythonスクリプトの実行環境により使えるロケールが変わりますので注意してください。
Pythonスクリプト中でロケールを変更してみる
では、ロケールを変更して一番日付表示でロケールの依存度がある月と曜日を表示するPythonスクリプトを実行してみます。
from datetime import datetime
import locale
# デフォルトのロケールで月と月の省略形と曜日を表示
print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A"))
# 各国のロケールで月と月の省略形と曜日を表示
locale_list = (
"pt_PT.UTF-8",
"de_DE.UTF-8",
"es_ES.UTF-8",
"ru_RU.UTF-8",
"el_GR.UTF-8",
"fi_FI.UTF-8",
"ja_JP.UTF-8",
)
for _l in locale_list:
locale.setlocale(locale.LC_TIME, _l)
print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A"))
# Cロケール(デフォルトのロケール)で月と月の省略形と曜日を表示
locale.setlocale(locale.LC_TIME, "C")
print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A"))
実行結果
(None, None) November Nov Friday
('pt_PT', 'UTF-8') Novembro Nov Sexta Feira
('de_DE', 'UTF-8') November Nov Freitag
('es_ES', 'UTF-8') noviembre nov viernes
('ru_RU', 'UTF-8') ноября ноя пятница
('el_GR', 'UTF-8') Νοεμβρίου Νοε Παρασκευή
('fi_FI', 'UTF-8') Marraskuu Mar Perjantai
('ja_JP', 'UTF-8') 11月 11 金曜日
(None, None) November Nov Friday
この様な形でロケールごとに月・曜日の表示が変わり、locale.setlocale()を使うことでPythonスクリプト内でロケールを変更して処理を行えることがわかりました。
まとめ
Pythonスクリプト中で一時的に使用するロケールを変更して国ごとに異なる日付フォーマットを扱ってみました。
最後まで読んで頂いてありがとうございました。






