Python で四半期の開始日・終了日を取得する

決算報告や売上集計では、四半期(クォーター)単位でデータを扱うことが多いです。Python で四半期の開始日・終了日を取得する方法を解説します。

四半期とは

1年を3ヶ月ずつ4つに分けた期間です。一般的には以下のように区分します。

Q11月〜3月
Q24月〜6月
Q37月〜9月
Q410月〜12月

ただし会計年度によっては4月始まり(日本企業に多い)や10月始まりもあるので、用途に合わせて調整が必要です。

1月始まりの四半期

まずは暦年ベース(1月始まり)で四半期を計算してみます。

from datetime import date
import calendar

def get_quarter(d):
    """日付から四半期番号を取得(1〜4)"""
    return (d.month - 1) // 3 + 1

def quarter_range(year, quarter):
    """指定した四半期の開始日と終了日を取得"""
    start_month = (quarter - 1) * 3 + 1
    end_month = start_month + 2
    
    start_date = date(year, start_month, 1)
    end_day = calendar.monthrange(year, end_month)[1]
    end_date = date(year, end_month, end_day)
    
    return start_date, end_date

# 2025年 Q1
start, end = quarter_range(2025, 1)
print(f"Q1: {start}{end}")  # Q1: 2025-01-01 〜 2025-03-31

# 2025年 Q3
start, end = quarter_range(2025, 3)
print(f"Q3: {start}{end}")  # Q3: 2025-07-01 〜 2025-09-30

(month - 1) // 3 で 0〜3 の値が得られるので、1 を足して 1〜4 の四半期番号に変換しています。

特定の日付が属する四半期の範囲

日付を渡して、その日が含まれる四半期の範囲を取得する関数も便利です。

from datetime import date
import calendar

def get_current_quarter_range(d):
    """指定日が属する四半期の開始日と終了日を取得"""
    quarter = (d.month - 1) // 3 + 1
    start_month = (quarter - 1) * 3 + 1
    end_month = start_month + 2
    
    start_date = date(d.year, start_month, 1)
    end_day = calendar.monthrange(d.year, end_month)[1]
    end_date = date(d.year, end_month, end_day)
    
    return start_date, end_date

today = date(2025, 5, 15)
start, end = get_current_quarter_range(today)
print(f"現在の四半期: {start}{end}")
# 現在の四半期: 2025-04-01 〜 2025-06-30

4月始まりの会計年度

日本の多くの企業は4月始まりの会計年度を採用しています。

from datetime import date
import calendar

def fiscal_quarter(d, fiscal_start_month=4):
    """会計年度ベースの四半期番号を取得"""
    adjusted_month = (d.month - fiscal_start_month) % 12
    return adjusted_month // 3 + 1

def fiscal_quarter_range(fiscal_year, quarter, fiscal_start_month=4):
    """会計年度の四半期範囲を取得"""
    start_month = fiscal_start_month + (quarter - 1) * 3
    
    # 13月以上なら翌年
    if start_month > 12:
        start_month -= 12
        start_year = fiscal_year + 1
    else:
        start_year = fiscal_year
    
    end_month = start_month + 2
    if end_month > 12:
        end_month -= 12
        end_year = start_year + 1
    else:
        end_year = start_year
    
    start_date = date(start_year, start_month, 1)
    end_day = calendar.monthrange(end_year, end_month)[1]
    end_date = date(end_year, end_month, end_day)
    
    return start_date, end_date

# 2024年度(4月始まり)の Q1
start, end = fiscal_quarter_range(2024, 1)
print(f"2024年度 Q1: {start}{end}")
# 2024年度 Q1: 2024-04-01 〜 2024-06-30

# 2024年度の Q4(1〜3月なので2025年)
start, end = fiscal_quarter_range(2024, 4)
print(f"2024年度 Q4: {start}{end}")
# 2024年度 Q4: 2025-01-01 〜 2025-03-31

4月始まりの場合、Q4 は翌年の1〜3月になる点に注意してください。

四半期のリストを生成する

複数の四半期を一括で生成したい場合はジェネレータが便利です。

from datetime import date
import calendar

def generate_quarters(start_year, end_year):
    """指定期間の四半期を生成"""
    for year in range(start_year, end_year + 1):
        for quarter in range(1, 5):
            start_month = (quarter - 1) * 3 + 1
            end_month = start_month + 2
            
            start_date = date(year, start_month, 1)
            end_day = calendar.monthrange(year, end_month)[1]
            end_date = date(year, end_month, end_day)
            
            yield year, quarter, start_date, end_date

# 2024〜2025年の四半期を列挙
for year, q, start, end in generate_quarters(2024, 2025):
    print(f"{year} Q{q}: {start}{end}")

集計レポートの期間指定やグラフの軸ラベル生成などに活用できます。