datetime モジュールは、日付や時刻を操作するためのクラスで、これにより日付や時刻に対する四則演算が可能です。日時のオブジェクトは、それがタイムゾーンの情報を含むかどうかによって “aware”(タイムゾーン情報あり)または “naive”(情報なし)に分けることができます。

このブログでは、”aware” と “naive” の特徴や相互変換などについて、Teamsライブイベントを例に取り上げて分かりやすく解説しました。


datetimeオブジェクトは、 naive と aware の2種類

time 型あるいは datetime 型のオブジェクトは aware か naive のどちらかです。 一方、date 型のオブジェクトは常に naive です。


通常 naive を使います

naiveはタイムゾーン情報を持ちません。 通常、こちらで四則演算等の操作します。例えば 2021年8月22日の午前7時7分30秒は、2021-08-22 07:07:30 となります。

時刻表示は24時間表示です。従って、午後4時33分17秒は 16:33:17 になります。


時差の調整のために aware に変換します

aware はタイムゾーン情報を持っています。 通常、時差(現地時刻と日本時刻変換等)の調整に使います。 

例えば、日本時間の2021年8月22日16時7分30秒は、UTC(グリニッジ標準)より+9時間(早い)ので2021-08-22 16:07:30+09:00 となります

[ここがポイント!]
片方がNaive、もう一方がAware のdatetime オブジェクト間での四則演算はできません。 いずれかに合わせる必要があります。 

  1. 計算(この場合は引き算)をしようとしましたが、以下の例外を返します
  2. TypeError: DatetimeArray subtraction must have the same timezones or no timezones

UTC時刻でログされたCSVデータをJST時刻に変換する

Teamsライブイベントの出席者エンゲージメントレポートを解析された方も少なくないかと思いますが この時刻表示はTeamsライブイベント出席者エンゲージメントレポートにも詳しい説明がありますが タイムスタンプはUTC時刻です。

日本時間(JST)に変換しないと、9時間遅れを理解して操作する必要がありますので、UTCからJSTに直すため、以下のようなタイムゾーンの操作が必須となります。


UTC to JST Datetime オブジェクトの操作

以下の操作をサンプルとして説明します。

  1. Teams の「Attendance Report」を例にCSVデータをデータフレームに取り込みます
  2. Datetime オブジェクトに変換(この場合、naiveでUTC時刻でログされているとします)
  3. “naive” から “aware” への変換
  4. タイムゾーン(時差)の調整(UTC から JST等)
  5. “aware” から “naive” に戻す

以下の図の通りになります。

aware_naive


参照ページ一覧

このブログを作成するにあたり、以下のページを参考にしています。

1) 時系列データのリサンプリングについて
2) EXCELシリアル値をDatetime に変換する
3) 生年月日から年齢を計算する
4) 文字列を日付に変換する