Функции работы с датами и временем в PySpark
to_date, to_timestamp, date_format, current_date, current_timestamp, year/month/dayofmonth, datediff, add_months, date_add/date_sub, trunc, date_trunc.
core
Основные функции работы с датами¶
1. Разбор и конвертация дат¶
to_date(column, format): Конвертирует строку в дату по указанному формату.to_timestamp(column, format): Конвертирует строку в timestamp.
from pyspark.sql.functions import to_date, to_timestamp
df.select(
to_date(df["date_string"], "yyyy-M-d").alias("parsed_date"),
to_timestamp(df["timestamp_string"], "yyyy-M-d HH:mm:ss").alias("parsed_timestamp")
)
2. Форматирование дат¶
date_format(date, format): Форматирует дату в строку по указанному шаблону (например,"yyyy-M-d","d/M/yyyy").
from pyspark.sql.functions import date_format
df.select(
date_format(df["date"], "d-M-yyyy").alias("formatted_date")
)
3. Текущая дата и время¶
current_date(): Возвращает текущую дату.current_timestamp(): Возвращает текущий timestamp.
from pyspark.sql.functions import current_date, current_timestamp
df.select(
current_date().alias("today"),
current_timestamp().alias("now")
)
4. Извлечение компонентов даты¶
year(): Извлекает год из даты.month(): Извлекает месяц.dayofmonth(): Извлекает день месяца.dayofweek(): Возвращает день недели в виде числа (1 = воскресенье, 7 = суббота).weekofyear(): Извлекает номер недели в году.
from pyspark.sql.functions import year, month, dayofmonth, dayofweek, weekofyear
df.select(
year(df["date"]).alias("year"),
month(df["date"]).alias("month"),
dayofmonth(df["date"]).alias("day"),
dayofweek(df["date"]).alias("weekday"),
weekofyear(df["date"]).alias("week_number")
)
5. Арифметика дат¶
datediff(end, start): Возвращает количество дней между двумя датами.add_months(date, numMonths): Прибавляет или вычитает месяцы из даты.date_add(date, days): Прибавляет указанное количество дней к дате.date_sub(date, days): Вычитает указанное количество дней из даты.
from pyspark.sql.functions import datediff, add_months, date_add, date_sub
df.select(
datediff(df["end_date"], df["start_date"]).alias("days_diff"),
add_months(df["date"], 3).alias("plus_3_months"),
date_add(df["date"], 7).alias("plus_7_days"),
date_sub(df["date"], 7).alias("minus_7_days")
)
6. Усечение дат¶
trunc(date, format): Усекает дату до указанного формата ("year","month"и др.).date_trunc(format, timestamp): Усекает timestamp до указанной единицы ("hour","day","month"и др.).
from pyspark.sql.functions import trunc, date_trunc
df.select(
trunc(df["date"], "month").alias("start_of_month"),
date_trunc("hour", df["timestamp"]).alias("start_of_hour")
)
Полный пример¶
from pyspark.sql import SparkSession
from pyspark.sql.functions import (
col, to_date, date_add, date_sub, datediff, months_between,
current_date, current_timestamp, year, month, dayofmonth, date_format
)
# Создание Spark Session
spark = SparkSession.builder.master("local").appName("Date Functions").getOrCreate()
# Тестовые данные
data = [
(1, "2024-11-10", "2024-11-20"),
(2, "2023-10-05", "2023-10-15"),
(3, "2022-05-01", "2022-05-10")
]
# Создание DataFrame
df = spark.createDataFrame(data, ["id", "order_date", "delivery_date"])
# Конвертация строк в формат даты
df = df.withColumn("order_date", to_date(col("order_date"), "yyyy-MM-dd"))
df = df.withColumn("delivery_date", to_date(col("delivery_date"), "yyyy-MM-dd"))
# Добавление колонок с текущей датой и временем
df = df.withColumn("current_date", current_date())
df = df.withColumn("current_timestamp", current_timestamp())
# Разница в днях между датой доставки и датой заказа
df = df.withColumn("days_to_delivery", datediff(col("delivery_date"), col("order_date")))
# Прибавить 5 дней к дате доставки
df = df.withColumn("delivery_plus_5", date_add(col("delivery_date"), 5))
# Вычесть 5 дней из даты доставки
df = df.withColumn("delivery_minus_5", date_sub(col("delivery_date"), 5))
# Количество месяцев между датой заказа и доставки
df = df.withColumn("months_between_order_delivery", months_between(col("delivery_date"), col("order_date")))
# Разница в днях между текущей датой и датой доставки
df = df.withColumn("days_from_today_to_delivery", datediff(current_date(), col("delivery_date")))
# Извлечение года, месяца и дня
df = df.withColumn("year", year(col("order_date")))
df = df.withColumn("month", month(col("order_date")))
df = df.withColumn("day", dayofmonth(col("order_date")))
# Форматирование даты в строку
df = df.withColumn("formatted_date", date_format(col("order_date"), "MMMM dd, yyyy"))
# Показать результаты
df.show(truncate=False)