[小ネタ]Pythonの日付操作で一時的にロケールを変更する

2021.11.29

はじめに

データアナリティクス事業本部の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スクリプト中で一時的に使用するロケールを変更して国ごとに異なる日付フォーマットを扱ってみました。

最後まで読んで頂いてありがとうございました。