Python で日付から曜日を算出する方法

シェアする

日付データを扱う場合に、画面や出力先のデータに曜日の情報を付与したいというケースはよくあります。
時系列情報を含むデータ分析業務などでは、曜日別に数値を集計して分析することもあるでしょう。

任意の日付の曜日情報を取得したいというニーズは日常的に発生しており、他のコンピュータ言語はもちろんのこと、EXCELなどのアプリケーションでも、これらに対応した機能が実装されています。

今回は Python における曜日情報の取り扱いについてみていきましょう。

date オブジェクトから曜日情報を取得する

Python で日付情報を扱うケースでは datetime モジュールの date オブジェクトを使うのが一般的です。

date オブジェクトは実在する日付であれば、任意の日付情報を持つオブジェクトを生成することができます。

また、オブジェクト生成時に曜日情報が自動的にセットされるため、任意の日付の曜日を取得することは実はそんなに難しくありません。

それでは、さっそくやってみましょう。

任意の日付の曜日情報を取得する

サンプルコード

from datetime import date
import calendar

# 出力結果の確認用にカレンダーを出力する
calendar.prmonth(2018,8)

# 曜日を取得したい日付
d = date(2018,8,15)

# 曜日情報を出力
print('weekday is %d' % d.weekday())

出力結果
    August 2018
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
 weekday is 2

2018年8月15日の曜日情報として 2 が得られていることが分かります。

date オブジェクトは曜日情報を0から6の整数で保持しています。

0なら月曜日、1なら火曜日と順番に並んで最後の6が日曜日ということになります。

なので、2018年8月15日は水曜日ということになります。

解説

8行目で2018年8月15日の date オブジェクトを生成しています。

そして、11行目で生成したオブジェクトから曜日情報を取り出して出力しています。

このように、 date オブジェクトの weekday メソッドにより整数値で表現された曜日情報を取得することができます。

曜日情報を認識できる文字列に変換してみよう

曜日情報を取得したのはよいのですが、このままでは人が見て認識することができません。

先ほどのコードに、もう一手間かけて曜日情報を理解できる文字列として出力してみましょう。

サンプルコード

from datetime import date
import calendar

# 曜日情報の文字列表現
week_name_list='月火水木金土日'

# 出力結果の確認用にカレンダーを出力する
calendar.prmonth(2018,8)

# 曜日を取得したい日付
d = date(2018,8,15)

# 曜日情報を出力
print('weekday is %s曜日' % week_name_list[d.weekday()])

出力結果
    August 2018
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
 weekday is 水曜日

2018年8月15日は水曜日として表現されていますね。

解説

5行目で week_name_list として曜日の和名表現リストを定義しています。

曜日の和名表現リストの並びは date オブジェクトの曜日表現の整数値と合わせています。

これを14行目で出力する際に、曜日情報の整数値から曜日の和名表現リストを使って、曜日名の文字列に変換して出力しています。

date オブジェクトから曜日の和名表現を出力してみる

先に紹介した方法は、日本語しか扱わないケースでは問題ありませんが、国際化対応したアプリケーションでは不適切ですね。

また、曜日の表現を自前で準備するというのもあまりオススメできません。

あちこちに似たようなリストを持つことになりかねないからです。

実は、dateオブジェクトを使う際に時間情報に関するローケール設定を変更することで、適切な曜日の文字列表現を得ることができます。

さきほどのサンプルコードに少し手を入れてみましょう。

サンプルコード

from datetime import date
import calendar
import locale

# 時間情報に関するロケール設定を変更する
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')

# 出力結果の確認用にカレンダーを出力する
calendar.prmonth(2018,8)

# 曜日を取得したい日付
d = date(2018,8,15)

# 曜日情報を出力
print('weekday is %s' % d.strftime('%A'))

出力結果
      8月 2018
月  火  水  木  金  土  日
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
 weekday is 水曜日

2018年8月15日が水曜日であることがわかります。

さきほどと同様の結果ですが、中身がどう違うのか見ていきましょう。

解説

まず、さきほどのサンプルコードにあった曜日の和名表現リストは姿を消しています。

6行目で時間情報に関するロケール設定を変更しています。

これで時間情報が日本語表現に変更されます。

そして15行目で date オブジェクトの内容を strftime メソッドで文字列として取得しています。

引数として渡している ‘%A’ というのが「曜日の完全名」を出力フォーマットとして指示している部分になります。

ここで代わりに ‘%a’ を指定すると「曜日の省略名」が表示されます。

どんな表記になるのか?

ぜひためしてみてください。

strftime メソッドの変換パラメータについてはこちらを参照ください。

「strftime() と strptime() の振る舞い」
https://docs.python.jp/3/library/datetime.html#strftime-strptime-behavior

まとめ

任意の日付から曜日情報を取得する方法をみてきました。

特に難しい点はありませんが、最後にポイントを挙げておきます。

  • date オブジェクトから曜日情報を取得できる。
  • date オブジェクトは実在する日付であれば任意の日付で生成できる。
  • date オブジェクトから取得できる文字列表現は、ロケール設定の影響を受ける。
  • ロケール設定を変えたくない時は、文字列表現への変換リストを用意することで容易に対応できる。

Python で日付情報を扱う上で date クラスは非常に強力な機能を提供してくれるので、仕様についてきっちり抑えておくとよいでしょう。

シェアする

フォローする