Python|現在の週番号(ISO週)を取得する:isocalendar()

1. はじめに

Pythonで日付や時刻を扱う際、「今が何週目か(週番号)」を知りたいケースは多くあります。たとえば、業務報告書を週単位で出力したり、売上データを週ごとにグルーピングしたりと、実務や分析において週番号は意外と重要な役割を持ちます。

そんなときに便利なのが、datetime.date オブジェクトの isocalendar() メソッドです。このメソッドを使えば、現在の日付からISO準拠の週番号(ISO週)を簡単に取得できます。

この記事では、Pythonで現在の週番号(ISO週)を取得する方法を、コード付きでわかりやすく解説します。初心者〜中級者向けに、使い方・応用・注意点まで丁寧に紹介しますので、ぜひ最後までご覧ください。

 

2. Pythonで週番号を取得する基本:isocalendar()の使い方

2-1. isocalendar()とは?

isocalendar() は、datetime.date または datetime.datetime オブジェクトに対して使えるメソッドです。返されるのは、次の3つの情報です:

  • ISO年(年)
  • ISO週番号(その年の何週目か)
  • ISO曜日番号(月曜=1〜日曜=7)

2-2. 現在の週番号を取得するコード例

まずは基本的なコードで、現在の週番号を取得してみましょう。

import datetime

# 今日の日付を取得
today = datetime.date.today()

# isocalendarでISOカレンダー情報を取得
iso_year, iso_week, iso_weekday = today.isocalendar()

# 結果を出力
print(f"ISO年: {iso_year}, ISO週番号: {iso_week}, ISO曜日: {iso_weekday}")

実行結果:

ISO年: 2025, ISO週番号: 30, ISO曜日: 3

この例では、2025年の第30週、水曜日(3)であることを示しています。週の始まりは月曜日(1)で、日曜日が7になります。

2-3. datetime.datetimeでも使える

datetime.date だけでなく、datetime.datetime 型でも isocalendar() は使用可能です。

import datetime

# 現在の日時を取得
now = datetime.datetime.now()

# isocalendarを適用
iso_info = now.isocalendar()

print(f"年: {iso_info.year}, 週: {iso_info.week}, 曜日: {iso_info.weekday}")

実行結果:

年: 2025, 週: 30, 曜日: 3

このように、現在の「日時」からも週番号を取得できます。

 

3. よくある使い方・応用例

3-1. 週単位でログファイルを管理する

週ごとにログを分けたいときには、ファイル名やフォルダ名に週番号を組み込むと便利です。

import datetime

today = datetime.date.today()
iso_year, iso_week, _ = today.isocalendar()

# ファイル名に週情報を含める
log_file = f"log_{iso_year}_week{iso_week}.txt"
print(f"出力ファイル名:{log_file}")

実行結果:

出力ファイル名:log_2025_week30.txt

3-2. 週の始まり(月曜)と終わり(日曜)を取得する

ある日が含まれる週の範囲(月〜日)を知りたい場合には、weekday() を使って範囲を計算できます。

import datetime

def get_week_range(date_obj):
    weekday = date_obj.weekday()  # 月曜=0, 日曜=6
    monday = date_obj - datetime.timedelta(days=weekday)
    sunday = monday + datetime.timedelta(days=6)
    return monday, sunday

today = datetime.date.today()
start, end = get_week_range(today)

print(f"週の始まり: {start}, 終わり: {end}")

実行結果:

週の始まり: 2025-07-21, 終わり: 2025-07-27

3-3. 年週キーでデータをグループ化

売上データやアクセスログを「年-週」でグルーピングするケースもあります。

def get_week_key(date_obj):
    year, week, _ = date_obj.isocalendar()
    return f"{year}-W{week:02}"

sample_date = datetime.date(2025, 7, 23)
print(get_week_key(sample_date))

実行結果:

2025-W30

このように、週単位でキーを作ることで、週ごとのデータ集計や比較がしやすくなります。

 

4. 注意点・エラー対策

4-1. 文字列にはisocalendar()は使えない

以下のように、str 型に直接 isocalendar() を使うとエラーになります。

# エラーになる例
date_str = "2025-07-23"
# print(date_str.isocalendar())  # AttributeError

正しくは、datetime.date に変換してから使用します:

import datetime

date_str = "2025-07-23"
date_obj = datetime.date.fromisoformat(date_str)
print(date_obj.isocalendar())

実行結果:

datetime.IsoCalendarDate(year=2025, week=30, weekday=3)

4-2. 年末年始の週番号に注意

12月31日や1月1日は、翌年や前年の週としてカウントされる場合があります。

import datetime

date1 = datetime.date(2020, 12, 31)
date2 = datetime.date(2021, 1, 1)

print(date1.isocalendar())
print(date2.isocalendar())

実行結果:

datetime.IsoCalendarDate(year=2020, week=53, weekday=4)
datetime.IsoCalendarDate(year=2020, week=53, weekday=5)

このように、1月1日でも「前年の週番号」に含まれることがあるので注意しましょう。

 

5. まとめ

本記事では、Pythonで現在の週番号(ISO週)を取得する方法について、isocalendar() の使い方を中心に解説しました。

  • isocalendar() はISO年・週・曜日を返す便利なメソッド
  • 週単位のファイル管理やデータ分析に実務で活用できる
  • 文字列には使えない、年末年始の週番号の扱いに注意が必要

学習のコツとしては、まず「実際の日付をいくつか試してみる」ことがおすすめです。2024年末や2025年初頭などを使って、週番号の挙動を体感することで、理解が深まります。

週単位の処理は、意外と業務の中で頻繁に登場します。isocalendar() はその基本を支える非常に実用的なメソッドです。ぜひ自分のプロジェクトでも活用してみてください。

タイトルとURLをコピーしました