この記事は Python Advent Calendar 2016 の 24日目の記事です。
当初は SCOOP についての記事を書きたくて、ひたすら SSH 使った分散処理の実行を試していたのですが、一向に動きそうな気配がなく間に合いそうにないため、最近見つけたライブラリの紹介にさせてもらいます。SCOOPでSSH使って動かせた人、救いの手を差し伸べていただければ嬉しいです。
Python の Datetime のここがいけてない
datetime と time の親和性が低い
Python の Datetime 型って time との親和性が全然いけてない。Datetime 型から Unixtimpstamp を得たかったら、こんないけてないコードを書かないといけない。
import time import datetime d = datetime.date(2015,1,5) unixtime = time.mktime(d.timetuple())
timetuple
なんてメソッド、かっこ悪くないですか。しかも、このままだと小数点以下の秒数は省略されてしまうので、d.microsecond
を計算に加えなければいけなかったりで、とても不便。その点、RubyのTimeはすごく使いやすいですよね。timeからdatetimeへは datetime.datetime.fromtimestamp
を呼べばなんとかなるのですが。
個人的には、timeモジュールとdatetimeモジュールは一本化してほしい、timeモジュールの存在価値はよくわかるので、datetime側ですべてラップして欲しいと思っていました。
パースメソッドがない
いちいち datetime.datetime.strptime
メソッドで時間フォーマットを書かないといけない。 dateparser
というモジュールもあるが、 datetime
とは別モジュールだし、使い勝手がいまいち。
タイムゾーンの処理
タイムゾーンの管理が環境依存なところ。忘れた頃に嵌まります。
Maya を使おう
Maya のここが良い
- タイムゾーンの管理が優秀
- ISO 8601 と RFC 2822 の両方の相互切り替えに完全に対応
- 文字列のパースが素敵
- Slang的な日時の出力もできる
- Datetime型への切り替えが容易
- 1970年からのepoch time を基準に作られているが、1970年以前にも対応済み
個人的な理解では、epoch time で管理してくれていて、Datetime的な出力を容易にしてくれるイメージです。Maya って名前ですが、マヤ暦とはまったく関係がなさそう。
インストール
いつもの pip で入ります。
pip install maya
使い方
In [1]: import maya In [2]: maya.now() Out[2]:In [5]: maya.when("tomorrow") Out[5]: In [6]: tomorrow = maya.when("tomorrow") In [7]: tomorrow.slang_date() Out[7]: 'tomorrow' In [8]: tomorrow.slang_time() Out[8]: '23 hours from now' In [9]: tomorrow.iso8601() Out[9]: '2016-12-22T04:12:41.979653Z' In [10]: tomorrow.rfc2822() Out[10]: 'Thu, 22 Dec 2016 04:12:41 GMT' In [11]: tomorrow.datetime() Out[11]: datetime.datetime(2016, 12, 22, 4, 12, 41, 979653, tzinfo= ) In [12]: maya.parse("2016/12/24") Out[12]: In [13]: eve = maya.parse("2016/12/24") In [14]: eve.iso8601() Out[14]: '2016-12-24T00:00:00Z' In [19]: eve = maya.when("2016/12/24", timezone="JST") In [20]: eve.iso8601() Out[20]: '2016-12-23T15:00:00Z' In [25]: import time In [26]: s = maya.MayaDT(time.time()) In [27]: s.datetime(to_timezone=s.local_timezone) Out[27]: datetime.datetime(2016, 12, 21, 13, 38, 52, 899084, tzinfo= )
strftimeとかは一度datetimeをくぐらせないと使えないです。必要になればdatetimeを呼ぶと良さそうです。
まとめ
maya を使えば、ecpoch time を基準としたタイムゾーンの切り替えにも対応したDatetime型を使えます。これで、Unix Timestamp とかの処理で困ることは減りそうです。Pandas とかでも使えたらいいのになぁ。
コメント