20
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Pythonライブラリ『Japanera』で年号を賢く扱う

TL;DR

$ pip install japanera
from datetime import date
from japanera import Japanera, EraDate

janera = Japanera()

c_era = janera.era(date.today())

# 年号情報取得
print("現在の元号は <{}>: <{}> です".format(c_era.kanji, c_era.english))
    # -> 現在の元号は <平成>: <Heisei> です

# 年号と日付からstrftime
print("本日は <{}> です".format(c_era.strftime(date(2019, 4, 16), "%-E%-O年%m月%d日")))
    # -> 本日は <平成31年04月16日> です

# 元年表記にも対応
print("本日は <{}> です".format(c_era.strftime(date(1989, 8, 1), "%-E%-O年%m月%d日")))
    # -> 本日は <平成元年08月01日> です

# 年号と日付からstrftime(漢字)
print("本日は <{}> です".format(c_era.strftime(date(2019, 4, 16), "%-E%-kO年%-km月%-kd日")))
    # -> 本日は <平成三十一年四月十六日> です

# resultとfmtからstrptime
print(janera.strptime("本日は <平成31年04月16日>", "本日は <%-E%-O年%m月%d日>"))
    # -> [datetime.datetime(2019, 4, 16, 0, 0)]

# resultとfmtからstrptime(すべてのstrftimeフォーマットに対応)
print(janera.strptime("本日は <平成三十一年四月十六日> です", "本日は <%-E%-kO年%-km月%-kd日>"))
    # -> [datetime.datetime(2019, 4, 16, 0, 0)]

# EraDateで直接日付データを取得
print(EraDate(1512, 4, 16).strftime("%Y年%m月%d日は <%-E%-O年> です"))
    # -> 1512年04月16日は <永正09年> です

日本の元号を扱いたい!

そんなときのJapanera (ドキュメント, GitHub)

Eraクラス、EraDateクラス、EraDateTimeクラスがあり、それぞれ便利なクラスです。

日付から年号を取得


from japanera import EraDate, EraDateTime, Japanera
from datetime import date

janera = Japanera()

era_from_janera = janera.era(date(2019, 5, 1))
print(era_from_janera)
    # 令和: Reiwa

era_from_eradate = EraDate(2019, 5, 1)
print(era_from_eradate)
    # 令和-2019-05-01

print(era_from_eradate.era)
    # 令和: Reiwa

print(vars(era_from_janera))
    # {'kanji': '令和', 'english': 'Reiwa', 'start': datetime.date(2019, 5, 1), 'end': None, 'type': 'common'}

年号を用いたstrftime

era_date = EraDate(1520, 6, 1)
print(era_date.strftime("%-E%-O年%m月%d日"))
    # 永正17年06月01日

print(era_date.strftime("%-E%-kO年%-km月%-kd日"))
    # 永正十七年六月一日

使用できる記号は、datetime.date(time).strftimeに加え以下のものが追加されます。
- %-E: 年号の漢字名
- %-e: Shouwa -> Showaのように、冗長な母音を短くした英語名
- %-A: 英語名
- %-a: 英語名の最初の文字
- %-o: 年号始まって以来何年目かを、下二けたの値を0埋めしたもの
- %-O: 基本は%-oと同じだが、1年目のみが返される
- %-ko: 年号始まって以来何年目かを、下二けたの値を0埋めしたものを漢数字にしたもの
- %-kO: 基本は%-koと同じだが、1年目のみが返される
- %-km: 月を漢数字にして出力
- %-kd: 日を漢数字にして出力

また、Era, EraDate, EraDateTime, Japaneraすべてのクラスにstrtimeが実装されています。

年号を用いたstrptime

Era, Japanera両方のクラスにstrptimeが実装されており、Eraの場合はマッチするdatetime.ditetimeオブジェクトを、Japaneraの場合は全ての元号を検査し、マッチしたすべてのdatetime.datetimeオブジェクトをリストで返します。

janera = Japanera()

print(janera.strptime("令和元年五月十九日", "%-E%-kO年%-km月%-kd日"))
    # -> [datetime(2019, 5, 19, 0, 0)]

era = janera.era(datetime.date(2019, 5, 19))
print(era)
    # 令和: Reiwa

print(era.strptime("令和元年五月十九日", "%-E%-kO年%-km月%-kd日"))
    # -> 2019-05-19 00:00:00

また、このライブラリの数字-漢字変換にはkanjizeライブラリが使用されています。
kanjizeの記事はこちらをご覧ください

そのほかにも多くの機能があります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
20
Help us understand the problem. What are the problem?