▶ Pythonでデータ分析をする際の学習方法を解説した記事はこちらです
はじめに
今回は会員登録日からの経過年数を計算することを考えてみることにします。会員登録日と現在の日付を比較することで、経過年数の計算をすることができますね。timeモジュールを使うと日付を構造化されたデータで扱うことができます。さらに経過年数の計算にちょっとしたテクニックもあわせてご紹介します。
経過年数の計算
準備
まずはサンプルデータを用意しましょう。ここでは会員登録日の異なる2人の会員「らいおん」と「ねこ」を考えることにしましょう。
はじめに今回使う、datetime, timeをインポートしておきましょう。また、今回は会員を管理する仕組みをクラスで作ることにしましょう。Memberというクラスで名前と会員登録日をname, regist_dayというインスタンス変数で管理することにしましょう。
# ライブラリ/モジュールのインポート
import datetime as dt
import time
# Memberクラスの定義
class Member:
def __init__(self, name, regist_day):
self.name = name
self.regist_day = dt.datetime.strptime(regist_day,'%Y/%m/%d')
# インスタンスの作成
rion=Member('らいおん','2011/5/3')
cat=Member('ねこ','2011/5/10')
# 各インスタンスの会員登録日を確認
print(f'{rion.name}さんの会員登録日:{rion.regist_day}')
print(f'{cat.name}さんの会員登録日:{cat.regist_day}')
11行目ではインスタンス作成時に受け取るregist_dayを日付型に変換しています。ちゃんと「らいおん」と「ねこ」の会員登録日が表示されてますね。これで準備が整いました。
▶ クラスを基本から学びたい場合は以下の記事を参考にしてください。
経過年数を計算する
会員登録日の準備ができたので、現在の日付を取得すればどのくらい経過しているのかを計算することができます。datetimeライブラリでも「datetime.date.today(現在の日付を取得)」や「datetime.datetime.now(現在の日時を取得)」のようにして現在の日付・日時を取得することができますが、ここでは練習のためにtimeモジュールを使ってみましょう。timeモジュールではtime.localtime()で取得することができます。これをtodayという変数に入れておきましょう。
# 現在の日時を取得
today=time.localtime()
today
では、会員登録日からの経過年数を計算してみましょう。但し、ここでは(あえて)会員登録日はdatetimeライブラリ、現在の日時はtimeモジュールを使っているので注意が必要です。データ型をみてみると、以下のようになります。
# データ型の確認
print(type(regist))
print(type(today))
datetime型では年・月・日はそれぞれyear・month・dayで取得します。一方、time型ではtm_year・tm_mon・tm_mdayで取得します。
経過年数を計算するには、年はそのまま差分をとればよいですね。月日に関しては登録日が現在の日付の前なのか、後なのかで異なります。
- 現在の日付 < 登録日
「現在の西暦と会員登録した年の西暦の差分-1」が経過年になる - 現在の日付 >= 登録日
「現在の西暦と会員登録した年の西暦の差分」が経過年になる
これはタプルの比較を使うと簡単に計算することができます。先にタプルの計算例を見てみましょう。たとえば、2月3日を(2,3)、2月10日を(2,10)、3月4日を(3,4)と表すことにします。これらを比較してみましょう。
# タプルの比較
print('2月10日と2月3日を(2,10)<(2,3)として比較すると',(2,10)<(2,3))
print('2月10日と3月4日を(2,10)<(3,4)として比較すると',(2,10)<(3,4))
このように月日を(月,日)というタプルで表すと、日付の比較をすることができます。タプルでの比較は、以下のようになっています。
- まず一番目の要素を比較して大小が判定されれば、判定結果を真偽値(True/False)で返します。一番目の要素が同じ値の時には二番目の要素を比較します。
- 二番目の要素を比較して大小が判定されれば、判定結果を真偽値(True/False)で返します。二番目の要素が同じ値の時には三番目の要素を比較します。
以下、要素の数が増えてもこれが繰り返されます。要素数が異なる場合も比較することができますが、今回は割愛します。興味あれば、実際にいろんなパターンを作って試してみましょう。
このタプルの計算を使うとよさそうですね。会員登録日を(regist.month,regist.day)、現在の日付を(today.tm_mon, today.tm_mday)と表すことにすると、経過年数は次のように表せます。
duration = regist.year – today.tm_year – ((today.tm_mon, today.tm_mday) < (regist.month,regist.day))
Trueは1、Falseは0で計算されるので、現在の日付と登録日の日付の大小によってif文で場合分けする必要はなく、上記のように表現できるわけですね。では、これもコードにしておきましょう。クラス内のインスタンスメソッドとしてcalc_durationを定義しましょう。
def calc_duration(self):
today = time.localtime()
duration = today.tm_year - self.regist_day.year - ((today.tm_mon, today.tm_mday) < (self.regist_day.month,self.regist_day.day))
return duration
これで会員登録日からの経過年数を計算するインスタンスメソッドcalc_durationができました。rionとcatのインスタンスで試してみましょう。
# 会員登録日からの経過年数を計算
print(f'会員登録日は2011/5/3:2022/5/7までの経過年数は{rion.calc_duration()}年です。')
print(f'会員登録日は2011/5/10:2022/5/7までの経過年数は{cat.calc_duration()}年です。')
らいおんの登録日が2011/5/3、ねこの登録日が2011/5/10で2022/5/7までの経過年数を計算しています。月と日だけをみると、5/7はらいおんの登録日を過ぎています。一方、ねこの登録日は過ぎていません。そのため、らいおんは経過年数11年、ねこは経過年数10年と計算されています。
これは誕生日から年齢を計算する際にも使えますね。
まとめ
今回は会員登録日からの経過年数を計算をおこないました。ちょうどクラスの練習にもなるので、会員を管理する仕組みをクラスで作って解説しました。日付の計算は慣れるまではややこしいですが、構造化された日付データであれば扱いやすいですね。タプルの比較は、見慣れないうちは「???」かもしれませんが、慣れれば便利なツールになります。要素ごとに比較していく仕組みがわかれば、理解できるかと思います。
コメント