まだ Python の datetime で消耗しているの? maya 使おうぜ

Python
スポンサーリンク

この記事は 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 とかでも使えたらいいのになぁ。

コメント

タイトルとURLをコピーしました