「Pythonでの日付と時刻の効果的なコーディング」
Efficient coding of date and time in Python
datetime、zoneinfo、dateutil、およびpandasの活用方法
最近、時系列データに積極的に取り組んでおり、Pythonでの日付と時刻オブジェクトを扱っています。そのために、Pythonでdatetimeオブジェクトを扱うための便利なテクニックをいくつか学びました。この記事では、私が学んだ最も価値のあるヒントとトリックを共有し、要約します。
デモンストレーションのために、2つのKaggleデータセットを使用します。使用する際にはリンクを提供します。一緒に進める場合は、以下のライブラリをインポートしてください。
Datetime、zoneinfo、dateutil、およびpytz
Pythonで日付と時刻を扱うためによく使用されるパッケージには、datetime、dateutil、pytz、および最近のzoneinfoがあります。Datetimeは、Pythonで時刻と日付を扱うための組み込みモジュールであり、基本的な操作を行うことができます。Dateutilとpytzはサードパーティのモジュールであり、相対時間差、タイムゾーン、文字列の解析など、より複雑な操作を行う際に強力な拡張機能です。
ただし、Pythonバージョン3.9以降、zoneinfoがPython標準ライブラリに組み込まれているため、他のサードパーティのモジュール(dateutilやpytzなど)と比較して、より便利なタイムゾーンのサポートが提供されています。
したがって、使用するPythonのバージョンによっては、Pythonの組み込みモジュールだけで十分であり、異なるタイムゾーンを扱う際にはサードパーティのモジュール(dateutilやpytz)は必要ありません。
本記事の残りの部分では、主にdatetimeを使用した日付と時刻の処理に焦点を当てますが、zoneinfoやdateutilの潜在的なオプションも紹介します。この記事では、まず単一のdatetimeオブジェクトの操作に焦点を当て、次にnumpyとpandasを使用して配列やデータフレーム内の日付の処理について説明します:
- 日付またはdatetimeをゼロから作成する
- 文字列への変換と解析:strftime()、strptime()、およびdateutil
- numpyの日付と時刻 – numPyのdatetime64
- pandasでの日付と時刻
- 日付と時刻から特徴量を作成する
1. 日付またはdatetimeをゼロから作成する
datetimeパッケージを使用すると、ゼロから簡単に日付とdatetimeオブジェクトを作成できます。例えば、フィルタリングの閾値として使用できます(以下で作成したオブジェクトとその型を出力して、その形式をより良く理解してみてください)。
また、datetimeを使用して、今日や現在を参照する日付と時刻オブジェクトを作成できます。
ここで注意が必要です。datetimeオブジェクトは通常「タイムゾーンを持たない」ため、国際的な同僚と協力する際に問題が発生する可能性があります。
zoneinfoモジュールの助けを借りて(Pythonバージョン3.9以降で組み込まれています)、astimezone()のtzパラメータを使用してタイムゾーンを設定できます。
2. 文字列への変換と解析:strftime()、strptime()、およびdateutil
datetimeオブジェクトを文字列として表示したり、文字列をdatetimeオブジェクトに変換したりする必要がある場合があります。ここで、strftime()とstrptime()関数が役に立ちます。
datetimeオブジェクト(またはその一部)を文字列に変換する
datetimeオブジェクトの記述に使用される一般的なフォーマットコードはこちらで見つけることができます。
文字列をdatetimeオブジェクトに変換する
dateutilを使用して複雑な文字列を解析する
3. numpyの日付と時刻 – numPyのdatetime64
大規模なデータセットを扱う場合、numpyのdatetime64は便利です。設計上の理由から、datetimeやdateutilオブジェクトよりもはるかに高速に動作することがあります。numpyのdatetime64データ型は、日付と時刻を64ビット整数としてエンコードします。
これにより、日付と時刻をコンパクトに保存し、ベクトル化された操作(numpy配列の各要素に対して繰り返される操作)が可能となります。
上記のコードを実行するとわかるように、datetimeやdateutilオブジェクトでは、ベクトル化された操作はエラーが発生します。
4. pandasでの日付と時刻
時間系列データプロジェクトで作業する際には、pandasが良い選択肢になることがあります。
有名なデータ操作ライブラリであるpandasは、datetimeとdateutilの便利さを組み合わせ、numpyからの効果的な保存と操作の可能性を提供しています。
pandasデータフレームの作成(CSVから):日付列の解析
今、私たちはnumpyとpandasを使用してPythonで日付と時刻を処理する基本的な理解を持っています。しかし、しばしば、日付と時刻を自分で作成するのではなく、既に取り扱っているデータセットの一部として存在しています。KaggleデータセットNFLの日付列を持つpandasデータフレームを作成しましょう。
CSVからロードする場合、日付を保持する列は、明示的に指定されていない場合、文字列形式に変換されます。日付形式を受け取るために、”gameDate_dateformat”という名前の追加の列を作成するか、pd.read_csv()のパラメータparse_datesを介して日付列を直接渡すことができます。
時間系列データを扱う際に便利な操作の1つは、日付/時刻でフィルタリングしたり、日付/時刻を使用してデータフレームを部分的に抽出したりすることです。これには2つの方法があります:フィルタリング/部分的な抽出またはインデックス操作です。
pandasデータフレームの時間でのフィルタリング
部分的な抽出に使用する閾値の日付は、列と同じ形式であることを確認してください!
フィルタリングする列がdatetime形式の場合(例のように)、比較する日付は日付ではなくdatetime形式である必要があります!
pandasデータフレームの時間でのインデックス操作
さらに強力なのは、pandasデータフレームを日付または時刻でインデックス操作することです。
インデックス操作は、時間系列データで特に有用であり、ローリングウィンドウやタイムシフトなどのメソッドがあります。
5. 日付と時刻からフィーチャーを作成する
しばしば、日付自体ではなく、期間や曜日、または日付の一部(例:年)に興味がある場合があります。そのために、datetimeやpandasはいくつかの便利な操作を提供しています。
Timedelta
pandasでは、2つの日付時刻の差などを計算することができます。このために、Uberのトリップデータセット(KaggleデータセットUber)の開始時刻と終了時刻を見てみましょう。タイムデルタを調べるためには、いくつかの前処理(合計行の削除など)が必要です。
曜日または月の抽出
これは、単一のdatetimeとpandasのSeriesでは若干異なる方法で動作します。単一のdatetimeオブジェクトの曜日や月は、属性(例:.month)やメソッド(例:weekday())を追加することで直接アクセスできますが、pandasのSeriesでは常に.dtアクセサが必要です。
dt.アクセサを使用すると、datetimeシリーズからdatetime固有の属性やメソッドにアクセスできます。
日付/時刻のラグを作成する
時間系列データの場合、日付またはdatetimeのラグを追加するための便利な操作があります。
まとめ
Pythonで日付や時刻オブジェクトを扱うためには、組み込みパッケージdatetime(date()やstrftime()、strptime()など)の基本を知っていると有益です。Zoneinfoは、異なるタイムゾーンで作業する際に、サードパーティのモジュールよりも便利な新しい組み込みパッケージ(バージョン3.9以降)です。Dateutilは、複雑な文字列の解析など、単一の日付オブジェクトを扱う際に便利なライブラリです。日付や時刻を扱う際には、pandasがdatetime、dateutil、numpyの利点を組み合わせ、便利なライブラリとして機能します。
参考文献
- Modern Python Standard Library — Cookbook by Alessandro Molina (2018)
- Python Data Science Handbook by Jake VanderPlas (2017)
- Datacamp course: Working with Dates and Times in Python (2022)
- https://dateutil.readthedocs.io/en/stable/
- https://docs.python.org/3/library/datetime.html
- https://docs.python.org/3/library/zoneinfo.html
- https://peps.python.org/pep-0615/
- https://github.com/stub42/pytz/blob/master/src/README.rst#issues–limitations
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles