Pythonクックブック(3章)

dateutilモジュール。

インストール

サードパーティのモジュールなのでまずはインストールから。
サイトからtarballを持ってくるやり方もあるみたいだけど、easy_installでインストール可能なので、

[kobakoba0723@fedora13-intel64 ~]$ easy_install python-dateutil
Searching for python-dateutil
Reading http://pypi.python.org/simple/python-dateutil/
Reading http://labix.org/python-dateutil
Best match: python-dateutil 2.0
Downloading http://labix.org/download/python-dateutil/python-dateutil-2.0.tar.gz
Processing python-dateutil-2.0.tar.gz
Running python-dateutil-2.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-sXQGAy/python-dateutil-2.0/egg-dist-tmp-rPlpIE
Adding python-dateutil 2.0 to easy-install.pth file

Installed /home/kobakoba0723/lib/python2.6/site-packages/python_dateutil-2.0-py2.6.egg
Processing dependencies for python-dateutil
Finished processing dependencies for python-dateutil
[kobakoba0723@fedora13-intel64 ~]$ 

あれ、2.0が入っちゃった。。。
公開サイトを見ると、2.x系は1.5みたいなんだけどなぁ。まぁ、いいか。

relativedelta, rruleモジュール

dateutil.relativedelta は datetime.timedelta のような差分を扱うモジュール

>>> import dateutil
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2011, 7, 4, 22, 26, 22, 723727)
>>> now + dateutil.relativedelta.relativedelta(months=+1)
datetime.datetime(2011, 8, 4, 22, 26, 22, 723727)
>>> now + dateutil.relativedelta.relativedelta(months=+1, weeks=+1)
datetime.datetime(2011, 8, 11, 22, 26, 22, 723727)
>>> 
>>> today = datetime.date.today()
>>> today
datetime.date(2011, 7, 4)
>>> today + dateutil.relativedelta.relativedelta(months=+1, weeks=+1)
datetime.date(2011, 8, 11)
>>> today + dateutil.relativedelta.relativedelta(months=+2, weeks=+1, hour=10)
datetime.datetime(2011, 9, 11, 10, 0)
>>> 

relativedeltaを使うと、うるう年をモジュール側でちゃんと考慮して計算してくれる。

>>> datetime.date(2008, 1, 31) + dateutil.relativedelta.relativedelta(months=+1) 
datetime.date(2008, 2, 29)
>>> datetime.date(2011, 1, 31) + dateutil.relativedelta.relativedelta(months=+1)
datetime.date(2011, 2, 28)
>>> 
>>> datetime.date(2000, 2, 29)
datetime.date(2000, 2, 29)
>>> datetime.date(2000, 2, 29) + dateutil.relativedelta.relativedelta(years=+1)
datetime.date(2001, 2, 28)
>>> datetime.date(2000, 2, 29) + dateutil.relativedelta.relativedelta(years=-1)
datetime.date(1999, 2, 28)
>>> 
>>> datetime.date(2000, 1, 1) + dateutil.relativedelta.relativedelta(nlyearday=60)
datetime.date(2000, 3, 1)
>>> datetime.date(2000, 1, 1) + dateutil.relativedelta.relativedelta(yearday=60)
datetime.date(2000, 2, 29)
>>> 

つぎにrruleモジュールと思ってhelpでも眺めようと思ったらエラーが。。。

>>> help(dateutil.rrule)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'rrule'
>>> from dateutil import rrule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/kobakoba0723/lib/python2.6/site-packages/python_dateutil-2.0-py2.6.egg/dateutil/rrule.py", line 13, in <module>
    import _thread
ImportError: No module named _thread
>>> 

どうも_threadっていうモジュールがないからインポート処理が進まない。
調べてみると_threadは python 3 のモジュールだから進まない。python 2.x では thread って名前だった。
やっぱり、python-dateutil-2.0だったからうまくいかないのか。

アンインストール&&再インストール

easy_installで入れたんだから、easy_installで削除出来るといいなと思ってググってると、
"-mxN"オプション + モジュール削除でアンインストールできる。

[kobakoba0723@fedora13-intel64 site-packages]$ easy_install -mxN python_dateutilSearching for python-dateutil
Best match: python-dateutil 2.0
Processing python_dateutil-2.0-py2.6.egg

Using /home/kobakoba0723/lib/python2.6/site-packages/python_dateutil-2.0-py2.6.egg

Because this distribution was installed --multi-version, before you can
import modules from this package in an application, you will need to
'import pkg_resources' and then use a 'require()' call similar to one of
these examples, in order to select the desired version:

    pkg_resources.require("python-dateutil")  # latest installed version
    pkg_resources.require("python-dateutil==2.0")  # this exact version
    pkg_resources.require("python-dateutil>=2.0")  # this version or higher
[kobakoba0723@fedora13-intel64 site-packages]$ rm -rf python_dateutil-2.0-py2.6.egg/
[kobakoba0723@fedora13-intel64 site-packages]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dateutil
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named dateutil
>>> 

ちゃんとアンインストールできたようなので、次は1.5をインストールする。
easy_installで版数を指定する場合、"パッケージ名 == 版数"とやれば版数指定インストールが出来る。

[kobakoba0723@fedora13-intel64 python-dateutil-1.5]$ easy_install "python-dateutil == 1.5"
Searching for python-dateutil==1.5
Reading http://pypi.python.org/simple/python-dateutil/
Reading http://labix.org/python-dateutil
Best match: python-dateutil 1.5
Downloading http://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz
Processing python-dateutil-1.5.tar.gz
Running python-dateutil-1.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-WjExNi/python-dateutil-1.5/egg-dist-tmp-DH9yWO
Adding python-dateutil 1.5 to easy-install.pth file

Installed /home/kobakoba0723/lib/python2.6/site-packages/python_dateutil-1.5-py2.6.egg
Processing dependencies for python-dateutil==1.5
Finished processing dependencies for python-dateutil==1.5
[kobakoba0723@fedora13-intel64 python-dateutil-1.5]$

さて、今度はrruleのヘルプが見れるといいな。

>>> import dateutil
>>> help(dateutil.rrule)
>>> dateutil.rrule.rrule(dateutil.rrule.MONTHLY, dtstart=datetime.datetime(2011, 07, 04))
<dateutil.rrule.rrule instance at 0x1896e18>
>>> 

よし、見れたし、なんかうまく動きそう。続きは明日やろう。