2016/05/06更新

[Python] 日付や時間の扱い方に入門(datetimeモジュール)

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
先日はPythonでJSONを扱う(2系、3系)をブログに書きましたが、本日はdatetimeモジュールを用いた日付/時間処理をブログにまとめておきたいと思います。Python2系、3系のどちらでも利用可能です。

画像


目次




datetimeモジュールのドキュメント

datetimeに関する詳しいドキュメントは以下にあります。この記事ではその中でもよく使うものを中心にまとめました。

http://docs.python.jp/3.3/library/datetime.html



datetimeモジュールの中身

datetimeモジュールには以下のデータ型が存在します。
datetime.date
日付を表現するクラス。年月日を保持することができる。
datetime.time
時間を表現するクラス。時分秒とマイクロ秒を保持することができる。
datetime.datetime
日付と時間をまとめて扱うことができるクラス。
datetime.timedelta
2つの日付や時間の差を表現するためのクラス。
datetime.tzinfo
タイムゾーン情報を表現する基底クラス。
datetime.timezone
タイムゾーンについて、UTCからの固定オフセットとして実装するクラス。
ここでは上記のうちでもよく利用する、datetimedatetimetimedeltaについて扱いたいと思います。



datetime.dateクラス

datetime.dateは日付を表現するクラスで、年月日を保持することができます。以下のように利用します。

Python2系3系で共通

### date

# 引数に年月日を指定する
aDate = datetime.date(2015, 1, 1)

# 引数が範囲を超える場合はエラー(勝手に繰り越しなどはしない)
datetime.date(2015, 13, 1)

# 当日を取得する
datetime.date.today()

# タイムスタンプから日付を取得する
datetime.date.fromtimestamp(1442189545)

# 日付の演算
datetime.date.today() + datetime.timedelta(days=1)

# 日付の演算2
today = datetime.date.today()
yesterday = today + datetime.timedelta(days=-1)
datetime.date.today() - yesterday

# 日付の演算3
yesterday < today

# 値の変更
aDate = datetime.date(2015, 1, 1)
aDate.replace(year=2026)
aDate.replace(month=2)
aDate.replace(day=2)

# 曜日を返す(0:月曜日、6:日曜日)
aDate.weekday()

# 曜日を返す2(1:月曜日、7:日曜日)
aDate.isoweekday()

# フォーマット文字列1
aDate.isoformat()

# フォーマット文字列2
# http://docs.python.jp/3.3/library/datetime.html#strftime-strptime-behavior
aDate.strftime("%Y/%m/%d(%A) %H:%M:%S.%f")

# datetimeへ変換する
datetime.datetime(*(aDate.timetuple()[:6]))
Python言語の特徴の一つでもある、名前付き引数のおかげで、かなりわかりやすく実装できるなーという印象です。



datetime.timeクラス

datetime.timeクラスでは、時分秒などの時間を管理することができます。以下のように利用します。

Python2系3系で共通

### time

# 生成
aTime = datetime.time(1,20,35,432) # 1時20分35秒432マイクロ秒

# 値の取得
aTime.hour
aTime.minute
aTime.second
aTime.microsecond

# 値の変更
aTime = aTime.replace(hour=2)
aTime = aTime.replace(minute=50)
aTime = aTime.replace(second=10)
aTime = aTime.replace(microsecond=1000)

# 文字列にする
aTime.strftime("%H:%M:%S.%f")
今までのところtimeだけを使うことはあまりありませんでしたが、一応使う可能性はありそうだなーということでブログには書いてみました。



datetime.datetimeクラス

datetime.datetimeクラスでは、日付と時間の両方を管理することができます。以下のように利用します。

Python2系3系で共通

### datetime

# 引数に年月日時分秒マイクロ秒を与える
aDatetime = datetime.datetime(2015, 10, 12, hour=10, minute=20, second=30, microsecond=40)

# 現在日時
datetime.datetime.today()
datetime.datetime.now()

# タイムスタンプから日時を取得する
datetime.datetime.fromtimestamp(1442189545)

# dateオブジェクトとtimeオブジェクトを合わせる
aDate = datetime.date.today()
aTime = datetime.time(12, 30, 59)
datetime.datetime.combine(aDate, aTime)

# 文字列からdatetimeへ
# http://docs.python.jp/3.3/library/datetime.html#strftime-strptime-behavior
datetime.datetime.strptime("2015-01-01 12:30:59.296195", "%Y-%m-%d %H:%M:%S.%f")

# 値の取得
aDatetime.year
aDatetime.month
aDatetime.day
aDatetime.hour
aDatetime.minute
aDatetime.second
aDatetime.microsecond
aDatetime.weekday()
aDatetime.isoweekday()

# 演算
datetime.datetime.now() + datetime.timedelta(days=1)
datetime.datetime.now() - datetime.timedelta(weeks=1)
datetime.datetime(2015,1,1) - datetime.datetime(2015,1,2)
datetime.datetime(2015,1,1) < datetime.datetime(2015,1,2)

# Dateの取得
datetime.datetime.now().date()

# Timeの取得
datetime.datetime.now().time()

# Timestampの取得
datetime.datetime.now().timestamp()

# 文字列にする
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
ここまでのdatedatetimeを日付関連ではよく使うので、サラサラと使えるようになりたいものです。



datetime.timedeltaクラス

datetime.timedeltaクラスでは、日付や時間の差を扱うことができます。具体的には以下のように使います。

Python2系3系で共通

### timedelta

# 生成(引数は全てオプション、指定しなければ0)
aTimedelta = datetime.timedelta(days=1, seconds=2, microseconds=3, milliseconds=4, minutes=10, hours=15, weeks=20)

# 生成(負数も指定可能)
datetime.timedelta(days=-1)

# 演算
datetime.timedelta(days=10) + datetime.timedelta(days=20)
datetime.timedelta(days=10) - datetime.timedelta(days=20)
datetime.timedelta(days=10) * 5
datetime.timedelta(days=10) * 0.5
datetime.timedelta(days=10) / 2

# 絶対値を取得する
abs(datetime.timedelta(days=-10))
timedeltaはよく利用するクラスなので、こちらもサラサラと書けるようになりたい次第です。



最後に

今回はPythonのdatetimeモジュールについてブログを書きました。どのプログラミング言語でも日付処理はありますが、Pythonの日付処理は手軽に色々とできていいなーという感覚です。仕事ではPythonでの集計処理などで日付処理をよく利用しています。ぜひ使いこなせるようになりたい次第です。

最後になりますが本ブログでは、フロントエンドのネタやPythonネタを中心に情報を発信しています。気になった方はぜひ、RSSTwitterをフォローして頂けますと幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。