はじめに
今回は日時の操作方法について扱います。これまで文字列型や数値型の日付データを日付型に変換する方法を学びました。
今回は、日付型に変換した後の処理の仕方について整理しましょう。 Pythonには日時操作に関するモジュールがいくつか用意されて いますが、datetimeクラスとdateutilクラスを順にみていきましょう。
datetimeクラス
日時情報は、datetimeモジュールのdatetimeクラスが保持します。まずは、datetimeクラスを使って、日時オブジェクトを生成してみましょう。次のような書式になります。
datetime.datetime(年,月,日,時,分,秒,マイクロ秒)
※引数の「時」 以下は省略可能で、デフォルト値は0になります。
さっそく一つオブジェクトを作ってみましょう。
import datetime as dt
d1=dt.datetime(2020,7,4,23,15,59,99999)
d1
作成したオブジェクトから年、月、日、などの日時情報を取得するには次のようにします。
print(d1.year)
print(d1.month)
print(d1.day)
print(d1.hour)
print(d1.minute)
print(d1.second)
print(d1.microsecond)
このようにdatetimeオブジェクトのあとに「.year」 「.month」 「.day」 「.hour」 「.minute」 「.second」 「.microsecond」をつけることで取得できる。
データ集計をしていると、曜日が影響するケースも多々ある。datetimeオブジェクトから曜日の情報も簡単に取得することができる。
d1.weekday()
このように「.weekday()」は数字を返す。この数字は、月曜日:0~日曜日:6を表す。
日時の加算・減算はdatetimeモジュールのtimedeltaクラスを使うと、days, seconds, microseconds, milliseconds, minuites, hours, weeks, の加算・減算ができる。※年・月の加減算ができない
d1+dt.timedelta(days=1)
datetimeオブジェクト同士で演算子による加算/減算もできる。
d1=dt.datetime(2020,6,3)
d2=dt.datetime(2020,7,15)
dd=d2-d1
dd.days
dateutilクラス
dateutilクラスを使うことで、さらに高度な日時の操作を行うことができます。 dateutils.relativedeltaモジュールを用いると、timedeltaでできなかった年・月の加算を行うことができます。
# ライブラリのインポート
from dateutil.relativedelta import relativedelta
このrelativedeltaには、2つの書式があります。1つめの書式は、引数として2つのdatetimeオブジェクトを渡すものです。これは、1つめのオブジェクトと2つめのオブジェクトの「差」を計算します。
d1=dt.datetime(2020,7,4)
d2=dt.datetime(2019,8,15)
relativedelta(d1,d2)
このように、各オブジェクトの差分を計算してくれます。この例では、「10か月と19日」の差があることがわかります。各要素を取り出すには次のようにします。
relativedelta(d1,d2).years
relativedelta(d1,d2).months
relativedelta(d1,d2).days
全部、years, months, days, のように複数形になることに注意しましょう。2つ目は、キーワード引数を使った演算です。これは、datetimeではできなかった年・月の演算もできます。
d1=dt.datetime(2020,7,4)
d1+relativedelta(years=3)
d1+relativedelta(months=2)
キーワード引数の単数・引数では大きな違いがあります。dayという引数を使うと次のように前月・当月・翌月の月末/月初の情報を取得することもできます。
# 月初
d1=dt.datetime(2020,7,4)
d1+relativedelta(day=1)
# 月末
d1+relativedelta(day=99)
# 1か月前の月末
d1+relativedelta(months=-1,day=99)
このようにday=1とすると月初、day=99とすると月末となります。なんだかおもしろいですね。
まとめ
いかがでしょうか?今回は日時の操作方法について学びました。この辺は、何回か日付データを扱ううちに慣れるでしょう。よく復習しておいてください。
▶ タイムゾーンを考慮した処理を行う場合は以下を参考にしてください。
コメント