Pythonで日付の計算はdateutilを使う
April 05, 2010 at 10:00 PM | View CommentsPythonで日付の計算をするのにはdatetimeやcalendarなどの標準モジュールがあるのですが、easy_install などでインストールできる dateutilモジュールが便利です。
が、使い方を忘れがちなので、よく使うものをまとめてみました。
非常に便利なのでPythonを使っている人はかならずインストールしておきましょう。
#! /usr/bin/env python
#! vim: fileencoding=utf8
import datetime
def test_relativedelta():
"""
datetime.date型の加算減算のテスト
monthsなどsが付くと加算、
monthなどsが付かない場合は指定した数字になる
>>> from dateutil import relativedelta
>>> d = datetime.date(2009, 11, 3)
>>> d + relativedelta.relativedelta(months=+1)
datetime.date(2009, 12, 3)
>>> d + relativedelta.relativedelta(month=2, days=+3)
datetime.date(2009, 2, 6)
>>> d + relativedelta.relativedelta(months=+2, day=20)
datetime.date(2010, 1, 20)
月末のテスト
>>> d + relativedelta.relativedelta(months=+3, day=99)
datetime.date(2010, 2, 28)
"""
def test_parser():
"""
文字列からdatetime.datetimeを生成するテスト
ありがちなフォーマットなら指定なしでparseしてくれる
>>> from dateutil import parser
>>> parser.parse("2010-01-22")
datetime.datetime(2010, 1, 22, 0, 0)
>>> parser.parse("2010/01/22")
datetime.datetime(2010, 1, 22, 0, 0)
>>> parser.parse("20100122")
datetime.datetime(2010, 1, 22, 0, 0)
>>> parser.parse("2010 01 22")
datetime.datetime(2010, 1, 22, 0, 0)
"""
def test_rrule():
"""
特定の期間の月曜日を取得するテスト
>>> from dateutil.rrule import rrule, MO, WEEKLY, MONTHLY
>>> list(rrule(WEEKLY, byweekday=(MO),
... dtstart=datetime.datetime(2010,2,21),
... until=datetime.datetime(2010,4,20)))
[datetime.datetime(2010, 2, 22, 0, 0), datetime.datetime(2010, 3, 1, 0, 0), datetime.datetime(2010, 3, 8, 0, 0), datetime.datetime(2010, 3, 15, 0, 0), datetime.datetime(2010, 3, 22, 0, 0), datetime.datetime(2010, 3, 29, 0, 0), datetime.datetime(2010, 4, 5, 0, 0), datetime.datetime(2010, 4, 12, 0, 0), datetime.datetime(2010, 4, 19, 0, 0)]
特定期間の月最初の月曜日のリストを取得するテスト
>>> list(rrule(MONTHLY, byweekday=(MO(1)), dtstart=datetime.datetime(2010,2,21), until=datetime.datetime(2010,7,20)))
[datetime.datetime(2010, 3, 1, 0, 0), datetime.datetime(2010, 4, 5, 0, 0), datetime.datetime(2010, 5, 3, 0, 0), datetime.datetime(2010, 6, 7, 0, 0), datetime.datetime(2010, 7, 5, 0, 0)]
特定期間の月最後の月曜日のリストを取得するテスト
>>> list(rrule(MONTHLY, byweekday=(MO(-1)), dtstart=datetime.datetime(2010,2,21), until=datetime.datetime(2010,7,20)))
[datetime.datetime(2010, 2, 22, 0, 0), datetime.datetime(2010, 3, 29, 0, 0), datetime.datetime(2010, 4, 26, 0, 0), datetime.datetime(2010, 5, 31, 0, 0), datetime.datetime(2010, 6, 28, 0, 0)]
"""
def _test():
import doctest
doctest.testmod()
if __name__ == "__main__":
_test()
ちなみに上のように、関数のコメントにテストを書くのはdoctestと呼ばれるもので、こちらはPython標準の機能です。
categories:
python
ツイート