リアルタイムのデータを必要とするスクリプトで作業しているとき、特定の時間にデータをスケジュールしたり、取得したり、取得したタイムスタンプでデータを入力するために dateutil モジュールを使って作業しています。
多くのスクリプトを扱い、デフォルトの datetime
モジュールを使用して日付と時間のフォーマットを操作しようとすると、取得したデータに対して行う必要のある変更の数を考えると、大変な作業になるかもしれません。
幸いなことに、 dateutil
モジュールは、あなたの生活をより簡単にするための機能を提供するために作成されました。
dateutilモジュールは、既存の
datetimeモジュールの機能拡張を提供することに特化しており、そのため、
datetime` モジュールのインストールが前提条件となっています。
しかし、これは Python の標準ライブラリの一部なので、何も心配する必要はありません。
Python で dateutil モジュールをインストールする
dateutil` モジュールを使って作業を始める前に、まずそれをコンピュータにインストールする必要があります。
では、インストール手順に入りましょう。
# The command to install the module, through the pip manager. pip install python-dateutil
|
ここでは、pipパッケージマネージャを使用してインストールを完了しました。
また、Anacondaを使用してインストールを完了することもできます。
dateutilモジュールで作業する
モジュールのインストールに成功したら、今度はそれを使って作業を進めることができます!
1.0. モジュールとそのサブクラス。
dateutil` モジュールはいくつかの異なるサブクラスに分かれています。
あなたが何を扱っているのかわかるように、すぐにそれらに取り掛かりましょう。
- イースター
- パーサー
- リラティブデルタ
- rrule
- tz
- などなど。
このモジュールのサブクラスはそれほど多くありませんが、この記事ではそのうちのいくつかの機能についてのみ掘り下げます。
1.1 必要なメソッドをインポートする
すでにモジュールをインストールしたので、あとはメソッドを実行に移し、結果を得るだけです。
では、さっそくいくつかのメソッドを使ってみましょう。
待ってください、dateutil
モジュールで作業する前にいくつかのステップがあるかもしれません、そのうちの1つは最初にそれらをインポートする必要があるということです。
# We'll need to import methods from the datetime module as a base. import datetime
# Now, let's import some methods from the dateutil subclasses. from dateutil.relativedelta import *
from dateutil.easter import *
from dateutil.parser import *
from dateutil.rrule import *
|
これらのインポートによって、この記事を通して必要となる多くのメソッドを扱うことができるようになります。
1.2 datetimeの機能性
dateutil` モジュールを使い始める前に、このモジュールが datetime モジュールに依存しているという事実を思い出すかもしれませんね?
まあ、その通りなのですが。
dateutil` モジュールは datetime オブジェクトで動作するので、それを扱う前に datetime オブジェクトを作成する必要があります。
したがって、 datetime
モジュールのインポートが必要なのです。
それでは、さっそく dateutil
モジュールを使ってみましょう。
1.3. Datetime と relativedelta
relativedeltaサブクラスは
datetime` モジュールを拡張したもので、取得した情報から相対的な日付や時刻を扱うことができる機能を提供します。
つまり、現在使用している datetime
オブジェクトに、日、月、年を追加することができる。
また、 datetime
オブジェクトを使用して、時間的な間隔を扱うこともできる。
# Creating a few datetime objects to work with NOW = datetime.now()
print ( "The datetime right now : " , NOW)
TODAY = date.today()
print ( "The date today : " , TODAY)
|
それでは、相対日付を使って情報を検索してみましょう。
# Next month print (NOW + relativedelta(months = + 1 ))
# Next month, plus one week print (NOW + relativedelta(months = + 1 , weeks = + 1 ))
# Next month, plus one week, at 5 PM print (NOW + relativedelta(months = + 1 , weeks = + 1 , hour = 17 ))
# Next friday print (TODAY + relativedelta(weekday = FR))
|
このモジュールのもっと応用的な使い方は、いくつかの小さな操作を使って情報を検索することです。
# Finding out the last tuesday in the month print (TODAY + relativedelta(day = 31 , weekday = TU( - 1 )))
# We can also work with datetime objects directly # Example: Age of Sacra sacra_birthday = datetime( 1939 , 4 , 5 , 12 , 0 )
print ( "Sacra's Age : " , relativedelta(NOW, sacra_birthday).years)
|
お気づきのように、私たちは relativedelta
オブジェクトから years
だけを取り出しています。
これは、きれいな出力を得るために使用したものですが、Sacraが実際どのくらい古いかを正確に知りたい場合は、自分でrelativedeltaオブジェクトをいじってみてください。
1.4. Datetime と easter
easter` サブクラスは、一般的なイースターカレンダーを使用して日付と時刻を計算するために使用され、さまざまなカレンダーを基準にした datetime オブジェクトの計算を可能にします。
このサブクラスはかなり小さく、モジュール全体を定義する3つのオプションからなる1つの引数があるだけです。
- ユリウス暦、EASTER_JULIAN=1。
- グレゴリオ暦、EASTER_ORTHODOX=2。
- 西暦、EASTER_WESTERN=3
これをコードで書くと、次のようになる。
# The Julian Calendar print ( "Julian Calendar : " , easter( 1324 , 1 ))
# The Gregorian Calendar print ( "Gregorian Calendar : " , easter( 1324 , 2 ))
# The Western Calendar print ( "Western Calendar : " , easter( 1324 , 3 ))
|
1.5. 日付と時刻のパーサー
parser` サブクラスは、日付や時刻を表す複数の既知の書式をパースできることが知られている、優れた日付/時刻文字列パーサーを実現します。
# The parser subclass print (parse( "Thu Sep 25 10:36:28 BRST 2003" ))
# We can also ignore the timezone which is set to default locally print (parse( "Thu Sep 25 10:36:28 BRST 2003" , ignoretz = True ))
# We can also not provide a timezone, or a year # This allows for it to return the current year, with no timezone inclusion. print (parse( "Thu Sep 25 10:36:28" ))
# We can also provide variables which contain information, as values. DEFAULT = datetime( 2020 , 12 , 25 )
print (parse( "10:36" , default = DEFAULT))
|
タイムゾーンをローカルに、あるいは明示的に指定するオプションがたくさんあります。
タイムゾーン、年、時刻を提供するために情報を取り除くことは、デフォルトの引数として関数に渡される変数を使って行うことができ、ここで調べることができます。
1.6. Datetimeとrrule
rruleサブクラスは入力を使って、それぞれ
datetimeオブジェクトと
datetime` オブジェクトの再帰性についての情報を提供します。
# The rrule subclass # Daily repetition for 20 occurrences print ( list (rrule(DAILY, count = 20 , dtstart = parse( "20201202T090000" ))))
# Repeating based on the interval print ( list (rrule(DAILY, interval = 10 , count = 5 , dtstart = parse( "20201202T090000" ))))
# Weekly repetition print ( list (rrule(WEEKLY, count = 10 , dtstart = parse( "20201202T090000" ))))
# Monthly repetition print ( list (rrule(MONTHLY, count = 10 , dtstart = parse( "20201202T090000" ))))
# Yearly repetition print ( list (rrule(YEARLY, count = 10 , dtstart = parse( "20201202T090000" ))))
|
dateutil` モジュールの素晴らしい機能であるこのサブクラスは、多くのスケジューリングタスクやカレンダーストレージの革新的な機能を扱うことができるようになるかもしれません。
モジュール自体にはもっとたくさんの機能があり、より深いレベルで機能や引数について学びたい場合には、ドキュメントをチェックするのがよいアイデアでしょう。
まとめ
この記事を読み終えた方は、 dateutil
モジュールが datetime
モジュールが提供する情報を拡張して、通常計算や処理が必要な結果を生成する方法をご存知でしょう。
何か作業をするためにどのモジュールを見ればいいのかがわかれば、人生はもっとシンプルになります。
ということで、Python Pandas, Scipy, zipfile, psutil を使って作業する際に役立つモジュールをいくつか紹介します。
参考文献
- 公式の dateutil ドキュメント
- dateutil の使用例