2026-01-14

【備忘録】UNIX秒とタイムゾーン 〜 Pandas

Pandas は、Python プログラミング言語向けに開発されたデータ操作・分析用ソフトウェアライブラリです(三条項 BSD ライセンス)。特に数値テーブルや時系列データの操作のためのデータ構造と演算を提供しています。Pandas という名称は、経済計量学における「パネルデータ」という用語に由来しています。また「Pythonデータ分析」という語句をもじったものともされています 。Pandas により、R 言語で利用可能な DataFrame 操作の多くの同等の機能が Python でも利用できるようになりました。Pandas は NumPy を基盤として構築されています。

Wikipedia より引用、翻訳・編集

タイムゾーンにいつも苦しむ UNIX秒

UNIX 時間(エポック秒)は、UTC(協定世界時)の 1970 年 1 月 1 日 0 時 0 分 0 秒からの経過秒数です。本記事では「UNIX秒」と呼ぶことにします。

リアルタイムのデータを扱う時、取得したデータのタイムスタンプを UNIX秒 に直して保持するようにしています。あとになって分析などをする際に表示用に時刻フォーマットをするのですがタイムゾーンが合っていません。そんなときにいつも、その場しのぎの対処をしてしまっています。

分析やチャート作成時にタイムゾーンの情報は必要ないのですが、UNIX秒をタイムゾーンが付いていないローカル時刻表記に戻す時には、一旦はタイムゾーン付きの処理、変換をしてから、タイムゾーンの情報を削除する、という流れが確実です。

Pandas の Series で .dt アクセサを利用すれば一括処理が可能なので、サンプルでは一つの時刻(UNIX秒)しか扱いませんが、わざわざ Series にしてローカル時刻へ変換する処理の流れをまとめました。丁寧に言葉でくどくど説明しても解りにくいので、コードの簡単なコメントで済ませてしまっています。

import time

import pandas as pd

print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("UNIX秒からローカル時刻へ変換する流れ")
print("UNIX秒 → UTC (tz-aware) → JST (tz-aware) → tz-naive")
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

print("\nUNIX秒: 現在のUNIX秒を取得")
ts_epoch = time.time()
print(ts_epoch)

print("\nUNIX秒 → tz-naive: Pandas の Timestamp(utc=True 指定無し)→ Series へ ☹")
dt_no_utc = pd.to_datetime(ts_epoch, unit="s")
ser_no_utc = pd.Series([dt_no_utc])
print(ser_no_utc)

print("\n*** .dt アクセサを使った変換[備忘録] ***")
print("UNIX秒 → UTC (tz-aware): Pandas の Timestamp(タイムゾーン付き)→ Series へ")
dt_utc = pd.to_datetime(ts_epoch, unit="s", utc=True)
ser_utc = pd.Series([dt_utc])
print(ser_utc)

print("\nUTC (tz-aware) → JST (tz-aware): タイムゾーンを日本時間に変更")
ser_jst = ser_utc.dt.tz_convert("Asia/Tokyo")
print(ser_jst)

print("\nJST (tz-aware) → tz-naive: タイムゾーン情報を削除")
ser_no_tz = ser_jst.dt.tz_localize(None)
print(ser_no_tz)
実行例
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UNIX秒からローカル時刻へ変換する流れ
UNIX秒 → UTC (tz-aware) → JST (tz-aware) → tz-naive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

UNIX秒: 現在のUNIX秒を取得
1768363958.6145868

UNIX秒 → tz-naive: Pandas の Timestamp(utc=True 指定無し)→ Series へ ☹
0   2026-01-14 04:12:38.614586830
dtype: datetime64[ns]

*** .dt アクセサを使った変換[備忘録] ***
UNIX秒 → UTC (tz-aware): Pandas の Timestamp(タイムゾーン付き)→ Series へ
0   2026-01-14 04:12:38.614586830+00:00
dtype: datetime64[ns, UTC]

UTC (tz-aware) → JST (tz-aware): タイムゾーンを日本時間に変更
0   2026-01-14 13:12:38.614586830+09:00
dtype: datetime64[ns, Asia/Tokyo]

JST (tz-aware) → tz-naive: タイムゾーン情報を削除
0   2026-01-14 13:12:38.614586830
dtype: datetime64[ns]

参考サイト

  1. pandasで日付・時間の列を処理(文字列変換、年月日抽出など) | note.nkmk.me

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加