如何用PySpark和Python根据月份数字获取月初与月末日期
使用PySpark实现月份转月初、月末日期
假设你需要基于固定年份(示例为2022年),从现有月份数字列生成对应的月初和月末日期,以下是具体实现步骤:
1. 导入依赖并初始化SparkSession
首先导入PySpark所需的模块和函数:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, format_string, to_date, last_day, date_format
初始化SparkSession:
spark = SparkSession.builder.appName("MonthDateConversion").getOrCreate()
2. 创建测试数据(可选)
如果没有现成的DataFrame,可以先构造测试数据:
# 测试数据:包含月份数字的列 data = [(1,), (3,), (12,), (2,)] df = spark.createDataFrame(data, schema=["month_num"]) df.show()
输出:
+---------+ |month_num| +---------+ | 1| | 3| | 12| | 2| +---------+
3. 添加月初日期列
通过格式化字符串拼接年份、月份和"01",再转换为日期类型,最后按需求格式化显示:
# 生成2022年的月初日期,格式转为示例中的M/d/yyyy df = df.withColumn( "月初日期", date_format( to_date(format_string("2022-%02d-01", col("month_num")), "yyyy-MM-dd"), "M/d/yyyy" ) )
4. 添加月末日期列
利用PySpark内置的last_day函数,直接获取月初日期对应的当月最后一天,再格式化:
# 先获取日期类型的月初,再取月末,最后格式化显示 df = df.withColumn( "月末日期", date_format( last_day(to_date(format_string("2022-%02d-01", col("month_num")), "yyyy-MM-dd")), "M/d/yyyy" ) )
5. 查看结果
执行df.show()后,输出如下:
+---------+----------+----------+ |month_num|月初日期 |月末日期 | +---------+----------+----------+ | 1|1/1/2022 |1/31/2022 | | 3|3/1/2022 |3/31/2022 | | 12|12/1/2022 |12/31/2022| | 2|2/1/2022 |2/28/2022 | +---------+----------+----------+
说明
- 如果年份不是固定值,可以新增年份列或者将年份作为参数传入,只需要修改
format_string中的年份部分即可。 %02d用于确保月份数字是两位(比如1转为01),避免日期转换出错。- 若需要保留日期类型而非字符串格式,去掉外层的
date_format函数即可。
内容的提问来源于stack exchange,提问作者user19814628
相关产品推荐
相关产品推荐

