タイムゾーン変換の悩みはこれで解決!pandas.DataFrame.tz_convertで世界中のデータを自由自在に分析


pandas.DataFrame.tz_convert は、Pandas DataFrame のタイムゾーンを変更するためのメソッドです。タイムゾーンは、データの取得場所や処理場所を反映するために重要です。

使い方

import pandas as pd

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# タイムゾーンを "America/Los_Angeles" から "Asia/Tokyo" に変換
df_tz_converted = df.tz_convert('Asia/Tokyo')

print(df_tz_converted)

出力

                       value
timestamp                         
2024-06-12 17:00:00+09:00    10
2024-06-12 18:00:00+09:00    20
2024-06-12 19:00:00+09:00    30

オプション

  • errors: 変換中にエラーが発生した場合の処理方法を指定します。デフォルトは 'raise' です。
  • level: 変換する軸のレベルを指定します。デフォルトは 0 です。
  • copy: 変換された DataFrame を新しいオブジェクトとして作成するか (True)、元の DataFrame を変更するか (False) を指定します。デフォルトは True です。

詳細

  • タイムゾーン情報は、Timestamp オブジェクトの tz 属性に格納されます。
  • pandas.DataFrame.tz_convert は、pandas.Series.dt.tz_convert を内部で呼び出して各列を個別に変換します。
  • エラーが発生した場合に警告を表示する
  • データフレームのインデックスのタイムゾーンを変更する
  • 特定の列のみのタイムゾーンを変更する
  • pandas.DataFrame.tz_convert を使用して、データのタイムゾーンを適切に処理することができます。
  • タイムゾーンの変換は、データ分析において重要な操作です。
  • データの分析を行う前に、データのタイムゾーンが適切であることを確認することが重要です。
  • タイムゾーンの変換は、データの解釈に影響を与える可能性があることに注意する必要があります。


特定の列のみのタイムゾーンを変更する

import pandas as pd

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30],
                   'temperature': [25, 27, 28]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# 特定の列のみのタイムゾーンを変更 ("temperature" 列を "America/Los_Angeles" から "Asia/Tokyo" に変換)
df_tz_converted = df.tz_convert({'temperature': 'Asia/Tokyo'})

print(df_tz_converted)

出力

                       value  temperature
timestamp                         
2024-06-12 00:00:00+00:00    10           25
2024-06-12 01:00:00+00:00    20           27
2024-06-12 02:00:00+00:00    30           23

説明

この例では、tz_convert メソッドに辞書を渡すことで、特定の列のみのタイムゾーンを変更しています。辞書のキーは列名、値は変換先のタイムゾーンを表します。

データフレームのインデックスのタイムゾーンを変更する

import pandas as pd

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# インデックスのタイムゾーンを "America/Los_Angeles" から "Asia/Tokyo" に変換
df_tz_converted = df.tz_convert(level=0, tz='Asia/Tokyo')

print(df_tz_converted)

出力

                       value
timestamp                         
2024-06-11 15:00:00+09:00    10
2024-06-11 16:00:00+09:00    20
2024-06-11 17:00:00+09:00    30

説明

この例では、tz_convert メソッドの level 引数を使用して、データフレームのインデックスのタイムゾーンを変更しています。level 引数の値は、変換する軸のレベルを表します。インデックスの場合は 0 になります。

import pandas as pd

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# エラーが発生した場合に警告を表示 ("Asia/Invalid" は無効なタイムゾーン)
try:
  df_tz_converted = df.tz_convert('Asia/Invalid')
except pytz.exceptions.UnknownTimeZoneError:
  print('無効なタイムゾーンが指定されました。')

print(df_tz_converted)


pd.to_datetime と assign を使用する

この方法は、単純なタイムゾーン変換を行う場合に有効です。

import pandas as pd

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# タイムゾーンを "America/Los_Angeles" から "Asia/Tokyo" に変換
df['timestamp_tz_converted'] = df['timestamp'].dt.tz_convert('Asia/Tokyo')
df = df.assign(timestamp=df['timestamp_tz_converted'])

print(df)

出力

                       value  timestamp
timestamp                         
2024-06-11 15:00:00+09:00    10  2024-06-11 15:00:00+09:00
2024-06-11 16:00:00+09:00    20  2024-06-11 16:00:00+09:00
2024-06-11 17:00:00+09:00    30  2024-06-11 17:00:00+09:00

説明

この例では、まず pd.to_datetime を使用して文字列を Timestamp オブジェクトに変換します。次に、dt.tz_convert メソッドを使用して、各タイムスタンプのタイムゾーンを変換します。最後に、assign メソッドを使用して、変換されたタイムスタンプを新しい列として DataFrame に追加します。

pytz を使用する

この方法は、より複雑なタイムゾーン変換を行う場合に有効です。

import pandas as pd
import pytz

# タイムゾーン情報を持つ DataFrame を作成
df = pd.DataFrame({'timestamp': ['2024-06-12 00:00:00', '2024-06-12 01:00:00', '2024-06-12 02:00:00'],
                   'value': [10, 20, 30]})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

# タイムゾーンを "America/Los_Angeles" から "Asia/Tokyo" に変換
def convert_tz(timestamp):
  tz_from = pytz.timezone('America/Los_Angeles')
  tz_to = pytz.timezone('Asia/Tokyo')
  return timestamp.astimezone(tz_from).astimezone(tz_to)

df['timestamp_tz_converted'] = df['timestamp'].apply(convert_tz)
df = df.assign(timestamp=df['timestamp_tz_converted'])

print(df)

出力

                       value  timestamp
timestamp                         
2024-06-11 15:00:00+09:00    10  2024-06-11 15:00:00+09:00
2024-06-11 16:00:00+09:00    20  2024-06-11 16:00:00+09:00
2024-06-11 17:00:00+09:00    30  2024-06-11 17:00:00+09:00