タイムゾーン
Tom Scott
タイムゾーンを扱うべきではありません。できる限り避けましょう。
Datetime
データ型には、タイムゾーンを関連付けることができます。
有効なタイムゾーンの例は以下のとおりです:
None
: タイムゾーンなし、「タイムゾーン無意識」とも呼ばれます。UTC
: 協定世界時 (Coordinated Universal Time)。Asia/Kathmandu
: 「エリア/場所」形式のタイムゾーン。 利用可能なタイムゾーンについては、tz database time zones のリストを参照してください。
注意: +02:00 のような固定オフセットは、タイムゾーンの処理には適していません。上記の「エリア/場所」形式を使うことをお勧めします。これにより、タイムゾーンをより効果的に管理できます。
Datetime
には単一のタイムゾーンしか設定できないため、複数のタイムゾーンを持つ列を作ることはできません。複数のオフセットのデータを解析する場合は、utc=True
を渡して、すべてを共通のタイムゾーン (UTC) に変換することをお勧めします。詳しくは 日付と時刻の解析 をご覧ください。
タイムゾーンの設定と変換の主な方法は以下のとおりです:
dt.convert_time_zone
: 1 つのタイムゾーンから別のタイムゾーンに変換します。dt.replace_time_zone
: タイムゾーンを設定/解除/変更します。
一般的な操作の例を見てみましょう:
str.to_datetime
· dt.replace_time_zone
· Available on feature timezone
ts = ["2021-03-27 03:00", "2021-03-28 03:00"]
tz_naive = pl.Series("tz_naive", ts).str.to_datetime()
tz_aware = tz_naive.dt.replace_time_zone("UTC").rename("tz_aware")
time_zones_df = pl.DataFrame([tz_naive, tz_aware])
print(time_zones_df)
str.replace_all
· dt.replace_time_zone
· Available on feature dtype-datetime · Available on feature timezones
let ts = ["2021-03-27 03:00", "2021-03-28 03:00"];
let tz_naive = Series::new("tz_naive", &ts);
let time_zones_df = DataFrame::new(vec![tz_naive])?
.lazy()
.select([col("tz_naive").str().to_datetime(
Some(TimeUnit::Milliseconds),
None,
StrptimeOptions::default(),
lit("raise"),
)])
.with_columns([col("tz_naive")
.dt()
.replace_time_zone(Some("UTC".to_string()), lit("raise"), NonExistent::Raise)
.alias("tz_aware")])
.collect()?;
println!("{}", &time_zones_df);
shape: (2, 2)
┌─────────────────────┬─────────────────────────┐
│ tz_naive ┆ tz_aware │
│ --- ┆ --- │
│ datetime[μs] ┆ datetime[μs, UTC] │
╞═════════════════════╪═════════════════════════╡
│ 2021-03-27 03:00:00 ┆ 2021-03-27 03:00:00 UTC │
│ 2021-03-28 03:00:00 ┆ 2021-03-28 03:00:00 UTC │
└─────────────────────┴─────────────────────────┘
dt.convert_time_zone
· dt.replace_time_zone
· Available on feature timezone
time_zones_operations = time_zones_df.select(
[
pl.col("tz_aware")
.dt.replace_time_zone("Europe/Brussels")
.alias("replace time zone"),
pl.col("tz_aware")
.dt.convert_time_zone("Asia/Kathmandu")
.alias("convert time zone"),
pl.col("tz_aware").dt.replace_time_zone(None).alias("unset time zone"),
]
)
print(time_zones_operations)
dt.convert_time_zone
· dt.replace_time_zone
· Available on feature timezones
let time_zones_operations = time_zones_df
.lazy()
.select([
col("tz_aware")
.dt()
.replace_time_zone(
Some("Europe/Brussels".to_string()),
lit("raise"),
NonExistent::Raise,
)
.alias("replace time zone"),
col("tz_aware")
.dt()
.convert_time_zone("Asia/Kathmandu".to_string())
.alias("convert time zone"),
col("tz_aware")
.dt()
.replace_time_zone(None, lit("raise"), NonExistent::Raise)
.alias("unset time zone"),
])
.collect()?;
println!("{}", &time_zones_operations);
shape: (2, 3)
┌───────────────────────────────┬──────────────────────────────┬─────────────────────┐
│ replace time zone ┆ convert time zone ┆ unset time zone │
│ --- ┆ --- ┆ --- │
│ datetime[μs, Europe/Brussels] ┆ datetime[μs, Asia/Kathmandu] ┆ datetime[μs] │
╞═══════════════════════════════╪══════════════════════════════╪═════════════════════╡
│ 2021-03-27 03:00:00 CET ┆ 2021-03-27 08:45:00 +0545 ┆ 2021-03-27 03:00:00 │
│ 2021-03-28 03:00:00 CEST ┆ 2021-03-28 08:45:00 +0545 ┆ 2021-03-28 03:00:00 │
└───────────────────────────────┴──────────────────────────────┴─────────────────────┘