PySpark如何基于已有日期列的年月新增日固定为1的日期列
PySpark实现日期取当月第一天的方案
以下是两种可直接落地的实现方式:
- 方法1:使用
date_trunc函数(最简便,推荐)date_trunc函数支持直接将日期截断到指定时间单位,传入"month"参数时会自动返回当月第一天的时间戳,转为日期类型即可得到目标结果:
# 导入需要的函数 from pyspark.sql import functions as F # 假设你的原DataFrame名为df,created_date已经为Date类型 df = df.withColumn("new_date", F.date_trunc("month", F.col("created_date")).cast("date"))
如果created_date是字符串格式,需要先转成日期类型再处理:
df = df.withColumn("created_date", F.to_date(F.col("created_date"), "yyyy-MM-dd")) \ .withColumn("new_date", F.date_trunc("month", F.col("created_date")).cast("date"))
- 方法2:手动拼接日期(适配自定义场景)
如果需要更灵活的逻辑,也可以提取年月后手动拼接当月1日:
df = df.withColumn("new_date", F.to_date(F.concat_ws("-", F.year(F.col("created_date")), F.lpad(F.month(F.col("created_date")), 2, '0'), F.lit("01")), "yyyy-MM-dd") )
你可以用以下完整测试代码验证效果:
from pyspark.sql import SparkSession from pyspark.sql import functions as F from pyspark.sql.types import StructType, StructField, IntegerType, StringType, DateType # 初始化Spark会话 spark = SparkSession.builder.appName("test_month_first").getOrCreate() # 构造测试数据 schema = StructType([ StructField("id", IntegerType(), True), StructField("name", StringType(), True), StructField("created_date", DateType(), True) ]) data = [ (1, "abs", "2020-03-14"), (2, "csn", "2019-05-20") ] df = spark.createDataFrame(data, schema=schema) # 执行新增列逻辑 df = df.withColumn("new_date", F.date_trunc("month", F.col("created_date")).cast("date")) # 输出结果 df.show()
运行后输出结果如下,和需求完全一致:
+---+----+------------+----------+ | id|name|created_date| new_date| +---+----+------------+----------+ | 1| abs| 2020-03-14|2020-03-01| | 2| csn| 2019-05-20|2019-05-01| +---+----+------------+----------+
内容的提问来源于stack exchange,提问作者tharindu
相关产品推荐
相关产品推荐

