Pythonで簡単西暦から和暦への変換、元年表記対応も!

Python

Pythonで西暦日付を和暦日付に変換するためには。

Pythonには西暦日付を和暦日付に変換する関数が標準で用意されていないため、EXCELで元号を表示する帳票を作成している場合等で困る場合があります。

本記事を参照するとPythonで西暦→和暦変換できます。

seireki_to_wareki関数のサンプルコード

まずは、関数のサンプルコードを紹介します。

#元号情報
GENGO_DATA = "明治,M,18681023,大正,T,19120730,昭和,S,19261225,平成,H,19890108,令和,R,20190501"


def seireki_to_wareki(date, format_type = 1):  # format_typeのデフォルト値を1に設定
    """
    西暦を受け取り、元号で返します。
    
    Args:
        date (str): 処理する西暦の文字列 
        format_type(int):1 元号を漢字で返す 平成、令和 等,2 元号を記号で返す H R等
    Returns:
        str: 処理済みの文字列
    """
    
    # 元号のデータ
    eras = GENGO_DATA.split(',')

    # 比較のために日付を整数に変換
    date_int = int(date)

    # 対応する元号を特定するために元号リストを逆順で繰り返し処理
    for i in range(len(eras) - 1, 1, -3):
        # era_startには元号が始まる年月日(YYYYMMDD)が格納される
        era_start = int(eras[i])

        # 引数で与えられた日付が現在見ている元号の開始日以降であるか確認
        if date_int >= era_start:
            # format_typeに応じて元号の漢字名か記号を選択
            era_name = eras[i - 2] if format_type == 1 else eras[i - 1]

            # 年号を計算(元号の開始年からの年数を算出し、1を加える)
            # 例: 令和元年は2019年だが、20190501 - 20190501 = 0 なので、1を加えて元年とする
            year = str(date_int // 10000 - era_start // 10000 + 1).zfill(2)

            # 月日部分を切り出す
            month_day = date[4:]

            # 最終的な和暦の日付を組み立てて返す
            # 形式: [元号][年][月日](例: 昭和640107)
            return era_name + year + month_day

    # ここまでの処理で該当する元号が見つからなければ、明治時代より前の日付と判断してエラーメッセージを返す
    return "元号情報を登録してください。"


##############################################################
# 関数のテスト
if __name__ == "__main__":
    
        
    print("----明治以前---")
    results = seireki_to_wareki("18681022")
    print(results)
    print("\n")

    print("----明治------")
    results = seireki_to_wareki("18681023")
    print(results)
    results = seireki_to_wareki("19120729")
    print(results)
    print("\n")

    print("----大正------")
    results = seireki_to_wareki("19120730")
    print(results)
    results = seireki_to_wareki("19261224")
    print(results)
    print("\n")

    print("----昭和------")
    results = seireki_to_wareki("19261225")
    print(results)
    results = seireki_to_wareki("19890107")
    print(results)
    print("\n")

    print("----平成------")
    results = seireki_to_wareki("19890108")
    print(results)
    results = seireki_to_wareki("20190430")
    print(results)
    print("\n")

    print("----令和------")
    results = seireki_to_wareki("20190501")
    print(results)
    results = seireki_to_wareki("20190501",2)
    print(results)
    print("\n")

    print("----100年の境界")
    results = seireki_to_wareki("21171231")
    print(results)
    results = seireki_to_wareki("21180101")
    print(results)

seireki_to_wareki関数の実行例

以下は、実行例となります。

----明治以前---
元号情報を登録してください。


----明治------
明治011023
明治450729


----大正------
大正010730
大正151224


----昭和------
昭和011225
昭和640107


----平成------
平成010108
平成310430


----令和------
令和010501
R010501


----100年の境界
令和991231
令和1000101

元年表示を行いたい場合のseireki_to_wareki関数のサンプルコード

1年ではなく元年の表示を行いたい場合のサンプルコードも作成しましたので、こちらも紹介します。

#元号情報
GENGO_DATA = "明治,M,18681023,大正,T,19120730,昭和,S,19261225,平成,H,19890108,令和,R,20190501"


# 改訂版関数(ゼロ埋めを削除したバージョン)
def seireki_to_wareki(date, format_type=1):
    """
    西暦を受け取り、元号で返します。
    
    Args:
        date (str): 処理する西暦の文字列 
        format_type(int):1 元号を漢字で返す 平成、令和 等,2 元号を記号で返す H R等
    Returns:
        str: 処理済みの文字列
    """
    
    eras = GENGO_DATA.split(',')

    date_int = int(date)

    for i in range(len(eras) - 1, 1, -3):
        era_start = int(eras[i])

        if date_int >= era_start:
            era_name = eras[i - 2] if format_type == 1 else eras[i - 1]

            # 年号を計算
            year = date_int // 10000 - era_start // 10000 + 1
            year_str = str(year)

            # 元年の場合、年号を "元年" にする
            if year == 1:
                year_str = "元年"
            else:
                year_str += "年"  # 年号の後ろに "年" を追加

            # 月日部分をフォーマット
            month_day = date[4:6].lstrip("0") + "月" + date[6:].lstrip("0") + "日" if format_type == 1 else date[4:]

            if format_type == 2:
                # format_type が 2 の場合、年を2桁ゼロ埋め
                year_str = str(year).zfill(2)

            return era_name + year_str + month_day

    return "元号情報を登録してください。"




##############################################################
# 関数のテスト
if __name__ == "__main__":
    
    print("----明治以前---")
    results = seireki_to_wareki("18681022")
    print(results)
    print("\n")

    print("----明治------")
    results = seireki_to_wareki("18681023")
    print(results)
    results = seireki_to_wareki("19120729")
    print(results)
    print("\n")

    print("----大正------")
    results = seireki_to_wareki("19120730")
    print(results)
    results = seireki_to_wareki("19261224")
    print(results)
    print("\n")

    print("----昭和------")
    results = seireki_to_wareki("19261225")
    print(results)
    results = seireki_to_wareki("19890107")
    print(results)
    print("\n")

    print("----平成------")
    results = seireki_to_wareki("19890108")
    print(results)
    results = seireki_to_wareki("20190430")
    print(results)
    print("\n")

    print("----令和------")
    results = seireki_to_wareki("20190501")
    print(results)
    results = seireki_to_wareki("20190501",2)
    print(results)
    print("\n")

    print("----100年の境界")
    results = seireki_to_wareki("21171231")
    print(results)
    results = seireki_to_wareki("21180101")
    print(results)

元年表示版のseireki_to_wareki関数の実行例

以下は、実行例となります。

----明治以前---
元号情報を登録してください。


----明治------
明治元年10月23日
明治45年7月29日


----大正------
大正元年7月30日
大正15年12月24日


----昭和------
昭和元年12月25日
昭和64年1月7日


----平成------
平成元年1月8日
平成31年4月30日


----令和------
令和元年5月1日
R010501


----100年の境界
令和99年12月31日
令和100年1月1日

最後に

以上がPythonで西暦を和暦に変換する例です。


元号が変わった場合や明治以前の元号を利用したい場合でも以下を追加することにより対応が可能となっています。
GENGO_DATA = “明治,M,18681023,大正,T,19120730,昭和,S,19261225,平成,H,19890108,令和,R,20190501”

コメント

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