PySparkでの時刻変換色々

最近はデータエンジニアリングのお仕事がメインで、もっぱら PySpark を触っています。 自分向けの備忘録的も兼ねてちょいちょい blog に tips を書いていきたいと思います。

今回は時刻変換に関するもの。

タイムゾーン付き日付文字列をパースしてtimestamp型に変換

基本は to_timestamp 関数を使います。

from pyspark.sql.functions import col, to_timestamp

df = spark.createDataFrame([('2021-05-16T23:03:49.220Z',)], ['str_datetime'])
df = df.withColumn('datetime', to_timestamp(col('str_datetime'), "yyyy-MM-dd'T'HH:mm:ss.SSSX"))

日時フォーマットのパターン文字列は Java方式 です。Spark は Scala で作られているので、Python でコードを書いていてもこういうところで Java が顔を出してきます。

似たものとしてUNIX時間に変換する unit_timestamp という関数がありますが、こちらはミリ秒以下が切り捨てられることに注意してください。

from pyspark.sql.functions import unix_timestamp
from pyspark.sql.types import TimestampType

df = df.withColumn('time', unix_timestamp(col('str_datetime'), "yyyy-MM-dd'T'HH:mm:ss.SSSX").cast(TimestampType()))

日付文字列をdate型に変換

to_date 関数を使います。

from pyspark.sql.functions import to_date

df = df.withColumn('date_col', to_date(col('str_datetime'), "yyyy-MM-dd'T'HH:mm:ss.SSSX"))

ゾーン情報を使ってローカル時刻にタイムスタンプをずらす

from_utc_timestamp 関数を使います。 現地時刻に変換した文字列を取得したい時やタイムゾーン情報のないデータベースに登録するときとかに使うかも。

from pyspark.sql.functions import from_utc_timestamp

df = df.withColumn('local_time', from_utc_timestamp(col('time'), 'Asia/Tokyo'))

date型、timestamp型のカラムを手動作成する

Pythondatetime.date 型で値を投入すると Spark SQLDateType になります。
同様に datetime.datetime 型で値を投入すると Spark SQLTimestampType になります。

import datetime

a_date = datetime.date(2022, 1, 1)
a_datetime = datetime.datetime(2022, 1, 1, hour=1, minute=10, second=10, microsecond=100000)
df = spark.createDataFrame([(a_date, a_datetime)], ('date_col', 'time_col'))