高校物理160203 views
高校国語788336 views
高校化学2924392 views
雑学1473612 views
高校日本史190571 views
小学社会310485 views
英語613639 views
小学算数1200427 views
りんご209490 views
高校生物551766 views
Help
Tools
NewsSpreadsheetCalendarSlidesTier ListPen ToolIllustrationCrayonPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsCross SectionsMotion PathMechanicsWavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic Theory

English

Python で2つの日時の差から年齢や経過年数を計算する

生年月日から年齢を計算したり、入社日から勤続年数を求めたりする場面は多いです。Python で2つの日付の差から「年数」を正確に計算する方法を解説します。

単純な年の差は不正確

まず、やりがちな間違いを見てみましょう。

from datetime import date

birth = date(1990, 12, 25)
today = date(2025, 1, 15)

# これは不正確
age = today.year - birth.year
print(age)  # 35

この計算だと、誕生日がまだ来ていない場合でも年齢が1歳多くなってしまいます。2025年1月15日時点では、12月25日生まれの人はまだ34歳のはずです。

正確な年齢計算

誕生日が今年すでに過ぎたかどうかを考慮する必要があります。

from datetime import date

def calculate_age(birth_date, today=None):
    if today is None:
        today = date.today()
    
    age = today.year - birth_date.year
    
    # 今年の誕生日がまだ来ていなければ 1 を引く
    if (today.month, today.day) < (birth_date.month, birth_date.day):
        age -= 1
    
    return age

birth = date(1990, 12, 25)
print(calculate_age(birth, date(2025, 1, 15)))   # 34
print(calculate_age(birth, date(2025, 12, 25)))  # 35
print(calculate_age(birth, date(2025, 12, 26)))  # 35

タプルの比較を使って、月日がまだ来ていないかをチェックしています。

dateutil の relativedelta を使う

dateutil ライブラリの relativedelta を使うと、より直感的に年数・月数・日数を取得できます。

from datetime import date
from dateutil.relativedelta import relativedelta

birth = date(1990, 12, 25)
today = date(2025, 1, 15)

delta = relativedelta(today, birth)
print(f"{delta.years}{delta.months}ヶ月 {delta.days}日")
# 34歳 0ヶ月 21日

relativedelta は年・月・日を別々の属性として持っているため、細かい経過期間を表示したい場合に便利です。

勤続年数を計算する

入社日からの勤続年数も同じ考え方で計算できます。

from datetime import date
from dateutil.relativedelta import relativedelta

join_date = date(2018, 4, 1)
today = date(2025, 1, 15)

delta = relativedelta(today, join_date)
print(f"勤続 {delta.years}{delta.months}ヶ月")
# 勤続 6年 9ヶ月

人事システムや社内ツールでよく使われるパターンですね。

timedelta では年数は取れない

標準ライブラリの timedelta は日数しか保持しないため、単純に365で割っても正確な年数になりません。

from datetime import date

birth = date(1990, 12, 25)
today = date(2025, 1, 15)

delta = today - birth
print(delta.days)  # 12440

# これは不正確(うるう年を考慮していない)
rough_years = delta.days / 365
print(rough_years)  # 34.08...

おおよその値は得られますが、正確な年齢計算には使えません。

満年齢と数え年

日本では「数え年」という数え方もありますが、法律上の年齢は「満年齢」で計算します。

満年齢

生まれた日を0歳とし、誕生日ごとに1歳加算する

数え年

生まれた年を1歳とし、元日ごとに1歳加算する

この記事で紹介した方法は満年齢の計算です。数え年が必要な場合は、別のロジックを組む必要があります。

from datetime import date

def calculate_kazoedoshi(birth_date, today=None):
    """数え年を計算する"""
    if today is None:
        today = date.today()
    return today.year - birth_date.year + 1

birth = date(1990, 12, 25)
print(calculate_kazoedoshi(birth, date(2025, 1, 15)))  # 36

用途に応じて適切な計算方法を選んでください。