pythonの日付関連の操作メモです。
pythonは、標準でdatetimeモジュール、calendarモジュール、timeモジュールに日付関連の操作が提供されています。まずは、pythonの標準モジュールでの日付処理をまとめてみます。
1.標準モジュールを使った日付処理
現在の日付を得る
from datetime import date date.today() # datetime.date(2009, 7, 8)
from datetime import date import time date.fromtimestamp(time.time()) # datetime.date(2009, 7, 8)
現在日時を得る
from datetime import datetime datetime.now() # datetime.datetime(2009, 7, 8, 22, 59, 0, 688787) datetime.today() # datetime.datetime(2009, 7, 8, 23, 2, 53, 892892)
from datetime import datetime import time datetime.fromtimestamp(time.time()) # datetime.datetime(2009, 7, 8, 23, 24, 39, 457040)
日付オブジェクトの年月日時分秒を取得する
from datetime import datetime now = datetime.now() # datetime.datetime(2009, 7, 8, 22, 59, 0, 688787) now.year # 2009, 年 now.month # 7, 月 now.day # 8, 日 now.hour # 22, 時間 now.minute # 59, 分 now.second # 0, 秒 now.microsecond # 688787, ミリ秒
タイムスタンプに変換する
from datetime import datetime import calendar now = datetime.now() calendar.timegm(now.timetuple())
日時情報を整形した文字列を得る
from datetime import date date(2009, 7, 9).strftime('%Y/%m/%d') # '2009/07/09'
from datetime import datetime datetime(2009, 7, 8).strftime('%Y年%m月%d日 %H時%M分') # '2009年07月08日 23時34分'
from datetime import datetime import time time.strftime('%Y-%M-%d', datetime.now().timetuple()) # '2009-07-08'
N日後、N日前の日付を得る
timedeltaオブジェクトを使うことで簡単に求めることができます。 timedeltaオブジェクトは、週、日、時間、分、秒、ミリ秒を扱うことができます。
now = datetime.now() # datetime.datetime(2009, 7, 8, 0, 19, 3, 861658) now + timedelta(days=+1) # datetime.datetime(2009, 7, 7, 0, 19, 3, 861658), 翌日 now - timedelta(days=+1) # datetime.datetime(2009, 7, 9, 0, 19, 3, 861658), 前日
月初、月末日を取得する
月初日はreplace関数を使って簡単に求めることができます。
from datetime import datetime import calendar now = datetime.now() # datetime.datetime(2009, 7, 8, 0, 19, 3, 861658) now.replace(day=1) # datetime.datetime(2009, 7, 1, 0, 19, 3, 861658), 日を1日に設定
月末日はcalendarモジュールのmonthrange関数を使って求めます。
from datetime import datetime import calendar now = datetime.now() # datetime.datetime(2009, 7, 8, 0, 19, 3, 861658) range = calendar.monthrange(now.year, now.month) # (2, 31), calendar.monthrangeの返値は、(月の一日の曜日, 月の日数) now.replace(day=range[1]) # datetime.datetime(2009, 7, 31, 0, 19, 3, 861658), 現在月の末日を設定
日付の大小比較
from datetime import datetime now = datetime.now() # datetime.datetime(2009, 7, 8, 22, 59, 0, 688787) yesterday = now + timedelta(days=+1) now > yesterday # True
2.dateutilを使ってみる
pythonで日付関連の処理を行っていると、どうも痒いところに手が届いていないなと印象も持ちました。例を上げると、datetimeモジュールのtimedeltaオブジェクトでは年や月を扱うことができないため月跨ぎ、年跨ぎの処理を書かなければならない。また、ある期間の特定の曜日のみ抽出するといった場合、どうしても泥臭い処理を書かなければなりません。
pythonにはdateutilという拡張パッケージが提供されており、dateutilはその名の通り、日付関連の処理を抽象化した手段を提供してくれます。
実際に使用例を下記に示します。
N年後、N月後処理
from datetimeimport date from dateutil.relativedelta import relativedelta date(2008, 2, 29) + relativedelta(years=1) # datetime.date(2009, 2, 28) date(2008, 2, 29) + relativedelta(years=1, days=1) # datetime.date(2009, 3, 1) date(2009, 3, 1) - relativedelta(years=1, days=1) #datetime.date(2008, 2, 29)
date(2008, 8, 29) - relativedelta(months=6, days=1) # datetime.date(2008, 2, 28) date(2008, 8, 30) - relativedelta(months=6, days=1) # datetime.date(2008, 2, 28) date(2008, 8, 31) - relativedelta(months=6, days=1) #datetime.date(2008, 2, 28) date(2008, 9, 1) - relativedelta(months=6, days=1) # datetime.date(2008, 2, 29)
特定期間内の特定曜日のみを取得する
下記の例では、2007年1月1日〜2009年1月1日の期間で火曜日と木曜日の日付情報を取得しています。
from dateutil import rrule L = rrule.rrule(rrule.WEEKLY, byweekday=(TU,TH), dtstart=datetime(2007,1,1), until=datetime(2009,1,1)) [datetime.datetime(2007, 1, 2, 0, 0), datetime.datetime(2007, 1, 4, 0, 0), datetime.datetime(2007, 1, 9, 0, 0) ‥ ]
他にも様々な便利な機能がありますので、日付関連の操作にお困りの方は使ってみてはいかがでしょうか。 HP:python-dateutil