Pythonで日付の計算はdateutilを使う

  • April 05, 2010 22:00

Pythonで日付の計算をするのには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標準の機能です。

5.2 doctest -- 対話モードを使った使用例の内容をテストする