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型のカラムを手動作成する
Python の datetime.date
型で値を投入すると Spark SQL の DateType になります。
同様に datetime.datetime
型で値を投入すると Spark SQL の TimestampType になります。
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'))