Pythonクックブック(3章)

日付の続き、今日はdatetimeモジュール*1。明日はdateutilモジュールを使ってみる。

datetimeモジュール

基本的な日付型および時間型を扱うためのモジュール。

次の5つのクラスが属している

datetime
 |- class timedelta     : time/date/datetimeクラスの2つのインスタンスの差分を表す
 |- class tzinfo        : タイムゾーン情報の抽象基底クラス(必ず派生クラスを作成して使う)
 |- class time          : ローカルの時間(時,分,秒,マイクロ秒,タイムゾーン)を表す
 |- class date          : 日付(年,月,日)を表す
      |- class datetime : dateクラスとtimeクラスの全情報を表す
昨日、今日、明日
>>> import datetime
>>> today = datetime.date.today()
>>> yesterday = today - datetime.timedelta(days=1)
>>> tomorrow = today + datetime.timedelta(days=1)
>>> yesterday, today, tomorrow
(datetime.date(2011, 6, 27), datetime.date(2011, 6, 28), datetime.date(2011, 6, 29))
>>> print yesterday, today, tomorrow
2011-06-27 2011-06-28 2011-06-29
>>> 
1日前、現時点、1日後
>>> now = datetime.datetime.now()
>>> one_day_before = now - datetime.timedelta(days=1)
>>> one_day_after = now + datetime.timedelta(days=1)
>>> one_day_before, now, one_day_after
(datetime.datetime(2011, 6, 27, 0, 20, 17, 854036), datetime.datetime(2011, 6, 28, 0, 20, 17, 854036), datetime.datetime(2011, 6, 29, 0, 20, 17, 854036))
>>> print one_day_before, now, one_day_after
2011-06-27 00:20:17.854036 2011-06-28 00:20:17.854036 2011-06-29 00:20:17.854036
>>> 
月始め、今日、月末

月毎の最終日は、calendar.monthrange(year, month) -> [月始めの曜日、月末の日にち] から。

>>> import calendar
>>> import datetime
>>> today = datetime.date.today()
>>> calendar.monthrange(today.year, today.month)
(2, 30)
>>> first_day = today.replace(day=1)
>>> last_day = today.replace(day=calendar.monthrange(today.year, today.month)[1])
>>> first_day, today, last_day
(datetime.date(2011, 6, 1), datetime.date(2011, 6, 28), datetime.date(2011, 6, 30))
>>> print first_day, today, last_day
2011-06-01 2011-06-28 2011-06-30
>>> 

その他

組込み関数sumの第一引数には、ジェネレータを指定することが出来る。
大量のデータを扱う場合は、メモリの節約になる(はず)

[kobakoba0723@fedora13-intel64 ~]$ cat sumgenerator.py
print sum((x * x for x in range(10)))
[kobakoba0723@fedora13-intel64 ~]$ python -m pdb sumgenerator.py 
> /home/kobakoba0723/sumgenerator.py(1)<module>()
-> print sum((x*x for x in range(10)))
(Pdb) s
--Call--
> /home/kobakoba0723/sumgenerator.py(1)<genexpr>()
-> print sum((x*x for x in range(10)))
(Pdb) 
> /home/kobakoba0723/sumgenerator.py(1)<genexpr>()
-> print sum((x*x for x in range(10)))
(Pdb) 
--Return--
> /home/kobakoba0723/sumgenerator.py(1)<genexpr>()->0
-> print sum((x*x for x in range(10)))
(Pdb) 
--Call--
> /home/kobakoba0723/sumgenerator.py(1)<genexpr>()->0
-> print sum((x*x for x in range(10)))
(Pdb) 
> /home/kobakoba0723/sumgenerator.py(1)<genexpr>()->0
-> print sum((x*x for x in range(10)))
(Pdb) 

参考サイト

モジュールインデックス@Python 2.6.2 document
標準ライブラリ@Python 2.6.2 document
Pythonでの日付関連処理@Groove Labo

Python クックブック 第2版

Python クックブック 第2版

*1:ところどころでcalendarモジュールも使ってる