Pythonでの日付関連処理

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

Categorized: Python

Comments are closed.