PySpark中MMM-YY格式字符串转指定日期格式的方法
在PySpark DataFrame中转换"MMM-YY"为当月1日字符串
针对将"MMM-YY"格式的字符串转换为"01-MMM-YY"格式的需求,这里提供两种高效实现方案,适配不同场景:
方法一:日期解析+格式化(推荐,含有效性校验)
该方案先将输入字符串解析为日期类型(自动处理无效输入,返回null),再格式化为目标字符串,适合需要校验数据合法性的场景。
from pyspark.sql import SparkSession from pyspark.sql.functions import to_date, date_format, upper # 初始化Spark会话 spark = SparkSession.builder.appName("MonthToFirstDay").getOrCreate() # 构造测试数据 test_data = [("jun-22",), ("Jan-22",), ("Feb-21",), ("oct-23",), ("invalid-99",)] df = spark.createDataFrame(test_data, ["month_str"]) # 执行转换 result_df = df.withColumn( "first_day", date_format(to_date(upper("month_str"), "MMM-yy"), "dd-MMM-yy") ) # 查看结果 result_df.show(truncate=False)
输出结果:
+----------+-----------+ |month_str |first_day | +----------+-----------+ |jun-22 |01-JUN-22 | |Jan-22 |01-JAN-22 | |Feb-21 |01-FEB-21 | |oct-23 |01-OCT-23 | |invalid-99|null | +----------+-----------+
逻辑说明:
upper("month_str"):统一将月份缩写转为大写,避免因大小写差异导致日期解析失败;to_date(..., "MMM-yy"):将字符串解析为日期类型,Spark会自动将无日份的年月字符串映射为当月1日;date_format(..., "dd-MMM-yy"):将日期格式化为目标字符串格式。
方法二:字符串直接拼接(极致高效,无校验)
如果可以确保所有输入都是合法的"MMM-YY"格式,直接拼接前缀并统一大小写即可,避免日期解析的性能开销。
from pyspark.sql import SparkSession from pyspark.sql.functions import concat, lit, upper spark = SparkSession.builder.appName("MonthToFirstDay").getOrCreate() test_data = [("jun-22",), ("Jan-22",), ("Feb-21",)] df = spark.createDataFrame(test_data, ["month_str"]) result_df = df.withColumn( "first_day", concat(lit("01-"), upper("month_str")) ) result_df.show(truncate=False)
输出结果:
+----------+-----------+ |month_str |first_day | +----------+-----------+ |jun-22 |01-JUN-22 | |Jan-22 |01-JAN-22 | |Feb-21 |01-FEB-21 | +----------+-----------+
适用场景:
输入数据完全可信,无需校验格式合法性,追求最高执行效率时选用。
内容的提问来源于stack exchange,提问作者Pysparker
相关产品推荐
相关产品推荐

