PySpark如何从字符串YYYY/QQ中获取季度的最后一天

xyhw6mcr  于 2023-08-02  发布在  Spark
关注(0)|答案(2)|浏览(92)

我需要从这样的字符串2022/4中获取季度的最后一天,其中2022是年,4是季度。我的结果是这样的代码:

import pyspark.sql.functions as fun

fun.date_add(fun.date_trunc('quarter', fun.add_months(fun.to_date(fun.concat_ws(
    "-",
    fun.substring(col("period2"), 0, 4),
    fun.substring(col("period2"), -1, 1),
    lit(1)
)), 3)), -1)

字符串
但是我认为我的代码不是t the best way to find last day of quarter. I,我想知道是否有另一种解决方案?

8zzbczxx

8zzbczxx1#

您可以尝试:

df = df.withColumn(
    'last_day',
    fun.last_day(fun.concat(fun.substring_index('period2', '/', 1), fun.lit('-'), fun.substring_index('period2', '/', -1).cast('int') * 3))
)

字符串

bqucvtff

bqucvtff2#

将year-quarter转换为date,并通过+ a month - a day找到最后一天。

data = ['2022/4']

df = spark.createDataFrame(data, StringType())

df.withColumn('split', f.split('value', '/')) \
  .withColumn('year', f.col('split')[0]) \
  .withColumn('quarter', f.col('split')[1]) \
  .withColumn('date', f.to_date(f.concat(f.col('year'), f.lit('-'), (f.col('quarter') * 3).cast('int')), 'y-M')) \
  .withColumn('last_day', f.expr('date + interval 1 month - interval 1 day')) \
  .show(truncate=False)

+------+---------+----+-------+----------+----------+
|value |split    |year|quarter|date      |last_day  |
+------+---------+----+-------+----------+----------+
|2022/4|[2022, 4]|2022|4      |2022-12-01|2022-12-31|
+------+---------+----+-------+----------+----------+

字符串

相关问题