Open6

pythonとpolarsでのtimezoneの扱い方メモ

James HomerJames Homer

pythonで何らかのtimestampがあるログデータを扱うときに、そのtimestampがtz-awareかそうでないかで扱いが微妙に変わるのでその取り扱いの仕方のメモ

James HomerJames Homer

あとは自分で文字列からdatetimeオブジェクトを作るときに、その文字列がtz-awareでない場合にtzをつける方法のメモ

James HomerJames Homer

"%Y-%m-%d-%H-%M"形式かつ暗黙的にJSTであるという体の文字列をtz_infoをつけたJSTのdatetimeにしたい場合

import pytz
from datetime import datetime

text_dt = '2023-6-8-10-25' # timezoneを考慮しない文字列が与えられる場合
tokyo_tz = pytz.timezone('Asia/Tokyo')
dt = datetime.strptime(text_dt, "%Y-%m-%d-%H-%M")
dt_jst = tokyo_tz.localize(a_dt)
print(dt_jst) # >datetime.datetime(2023, 6, 8, 10, 25, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
James HomerJames Homer

polarsでtz_awareなtimestampをJSTとして取り扱いたい場合こうする.
ちなみにtime_zoneを指定しないと勝手にutcになる.

df = pl.read_csv("any.csv", dtypes={"timestamp": pl.Datetime(time_zone="Asia/Tokyo")})
James HomerJames Homer

polarsでtz_awareでないtimestamp(ただし暗黙的にJSTでの時間が入ってる)を取り扱う場合はこうする.

df = pl.read_csv("any.csv")
df = df.with_columns(
        pl.col("timestamp")
        .cast(pl.Datetime) # 別にread_csvの時に指定してもいいけど、こっちだとread_parquetみたいな時にも使える
        .dt.replace_time_zone("Asia/Tokyo") # このままだとutcのtimestampにされてるのでJSTに変える
        .alias("timestamp")
    )