質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
date

dateは、date型や日付に関する関数や処理についてのタグです

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

14020閲覧

python3 年齢計算をしたい(daysからyearを取得)(うるう年)

zyamu

総合スコア8

date

dateは、date型や日付に関する関数や処理についてのタグです

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/29 00:46

前提・実現したいこと

pythonにて、日数(timedelta.days)から、年(1年に満たないものは切り捨て)を計算したいです。
※年齢計算をスマートにできないか検討中です

該当のソースコード

# python 3.6.5 >>> from datetime import date >>> today = date.today() >>> print(today) 2018-07-29 >>> birth_day = date(1900, 1, 1) >>> date_delta = today - birth_day >>> print(date_delta) 43308 days, 0:00:00 >>> age = date_delta.days // 365 >>> print(age) 118

気にしている点

age = date_delta.days // 365

だと、うるう年に対応していないので、いいやり方がないか調べているところです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

timedelta.daysから算出する

その算出方法に合わせると、以下のような感じになります。

python

1from datetime import date 2 3 4def calculate_age(year, month, day): 5 """年齢を返す""" 6 today = date.today() 7 birth = date(year, month, day) 8 date_delta = today - birth 9 10 age = 0 11 total_days = date_delta.days 12 for year in range(birth.year, today.year): 13 # 400で割り切れるか、4では割り切れるが100で割り切れないなら閏年 14 if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): 15 day = 366 16 else: 17 day = 365 18 19 if total_days >= day: 20 age += 1 21 total_days -= day 22 23 return age 24

年齢計算自体をスマートにした方法

いくつか方法はありますが、よくある簡単な考え方として

  1. 今年(2018)から誕生年(1990)を引く(ここで28)
  2. 今年の誕生日を迎えていなければ、-1する(迎えていなければ27に)

と考えるとシンプルです。

python

1from datetime import date 2 3 4def calculate_age(year, month, day): 5 """年齢を返す""" 6 born = date(year, month, day) # あなたの誕生日 7 today = date.today() # 今日 8 9 age = today.year - born.year 10 11 # 今年の誕生日を迎えていなければ、ageを1つ減らす 12 # 今日を表すタプル(7, 29) < 誕生日を表すタプル(7, 30) 13 if (today.month, today.day) < (born.month, born.day): 14 age -= 1 15 return age

Pythonでは、タプル同士の比較ができます。
タプルの最初の要素同士を比較したあと、次の要素同士を比べます。
(7, 29) < (2, 27) はFalse
(7, 29) < (7, 30) はTrue
(7, 29) < (8, 1) はTrue
のようになります。

投稿2018/07/29 02:24

toritoritorina

総合スコア972

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zyamu

2018/07/30 21:50

"年齢計算自体をスマートにした方法"参考になりました ぱっとみで理解しやすくよいですね、ありがとうございますm(_ _)m
guest

0

こちらの記事が参考になります。生年月日から年齢を簡易計算する数式

(yyyymmdd形式で表示した今日 - yyyymmdd形式で表示した生年月日) / 10000 の整数部分が年齢となります。
たとえば2012年7月28日に生まれた人の誕生日は、(20180729 - 20120728) / 10000 = 6.0001から6歳であることがわかります。もし明日誕生日ならば、(20180729 - 20120730) / 10000 = 5.9999から5歳であることがわかります。
つまり、math.floor((今日の年月日 - 生年月日) / 10000)で年齢を求められます。

簡易的にですが実装例を

python

1import datetime 2import math 3 4 5def cal_age(birthday_str): 6 """ 7 Calculate age. 8 :param birthday_str: 'yyyymmdd' format. 9 :return: int: age 10 """ 11 today = int(datetime.datetime.today().strftime("%Y%m%d")) 12 return math.floor((today - int(birthday_str)) / 10000) 13 14 15print(f"今日生まれた赤ちゃんの年齢:{cal_age('20180729')}") 16print(f"明日生まれる赤ちゃんの年齢:{cal_age('20180730')}") 17print(f"赤川次郎の年齢:{cal_age('19480229')}") 18print(f"織田信長の年齢:{cal_age('15340623')}") 19

結果

今日生まれた赤ちゃんの年齢:0 明日生まれる赤ちゃんの年齢:-1 赤川次郎の年齢:70 織田信長の年齢:484

まだ生まれていない人の年齢は-1となります。
ほかにもいろいろやり方があるので調べてみてくださいね。

投稿2018/07/29 01:35

crimnut

総合スコア380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zyamu

2018/07/30 21:48

実装例までありがとうございますm(_ _)m いろいろと試したくなってきました
guest

0

「うるう年 判定」でぐぐると、うるう年の算出法が出てきます。
また、「万年カレンダー プログラム」でぐぐってみてください

西暦1年1月1日からの通算日数の算出、
通算日数から年月日の変換、
などの関数を作ってみてください。

あとあとやくにたちますぜ

投稿2018/07/29 00:59

編集2018/07/29 01:02
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zyamu

2018/07/30 21:47

万年カレンダー、初めて認識しました ぐぐるとたくさんの情報がでてきますね、トレーニングに実装してみたいと思いいます 回答ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問