この記事は公開されてから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スクリプト中で一時的に使用するロケールを変更して国ごとに異なる日付フォーマットを扱ってみました。
最後まで読んで頂いてありがとうございました。