前提・実現したいこと
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
だと、うるう年に対応していないので、いいやり方がないか調べているところです。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答3件
1
ベストアンサー
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
年齢計算自体をスマートにした方法
いくつか方法はありますが、よくある簡単な考え方として
- 今年(2018)から誕生年(1990)を引く(ここで28)
- 今年の誕生日を迎えていなければ、-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
総合スコア970
1
こちらの記事が参考になります。生年月日から年齢を簡易計算する数式
(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
総合スコア380
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
0
「うるう年 判定」でぐぐると、うるう年の算出法が出てきます。
また、「万年カレンダー プログラム」でぐぐってみてください
西暦1年1月1日からの通算日数の算出、
通算日数から年月日の変換、
などの関数を作ってみてください。
あとあとやくにたちますぜ
投稿2018/07/29 00:59
編集2018/07/29 01:02総合スコア86774
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
IndexError: index 0 is out of bounds for axis 0 with size 0の理由がわからない
回答1
クリップ0
更新
2018/09/27
Q&A
受付中
Windows上で扱うタイムスタンプ関数には謎の遅延(空白時間)が生まれる?
回答2
クリップ2
更新
2023/05/25
Q&A
解決済
python openpyxlでエクセル関数を入力し 関数で計算した"値"を取り出したい。
回答1
クリップ0
更新
2023/05/29
Q&A
解決済
OpenCVで画像の輪郭の複雑さを数値化したいです。
回答3
クリップ0
更新
2023/05/29
意見交換
受付中
正規表現ライブラリの機能比較とベンチマーク
回答12
クリップ1
更新
2023/05/24
Q&A
解決済
Pythonのfor文内でlambda関数を用いて定義した関数が意図通りの挙動をしないです。
回答2
クリップ0
更新
2023/05/24
Q&A
解決済
Google CloudのOAuthを使用したPythonメール送信での認証エラー(535)の解決方法が知りたい
回答1
クリップ0
更新
2023/05/29
Q&A
解決済
Pythonでeval,execを使った条件分岐課題の解法について
回答4
クリップ4
更新
2023/04/23
同じタグがついた質問を見る
dateは、date型や日付に関する関数や処理についてのタグです
Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/07/30 21:50