You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark空DataFrame中自动生成并填充日期列

在PySpark中生成指定范围的日期序列DataFrame

方法1:使用sequence函数(PySpark 2.4+推荐)

利用PySpark内置的sequence函数生成连续日期序列,再通过explode展开为单行日期记录。

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, sequence, to_date, lit, date_format

# 初始化SparkSession
spark = SparkSession.builder.appName("DateRangeGenerator").getOrCreate()

# 定义目标日期范围
start_date = "1900-01-01"
end_date = "2030-12-31"

# 生成Date类型的日期列(默认显示格式为yyyy-mm-dd)
date_df = spark.createDataFrame([(start_date, end_date)], ["start", "end"]) \
    .withColumn(
        "date_col",
        explode(sequence(to_date(lit(start_date)), to_date(lit(end_date)), lit("1 day")))
    ) \
    .select("date_col")

# 若需要字符串格式的日期列,可添加转换逻辑
date_df = date_df.withColumn("date_str", date_format("date_col", "yyyy-MM-dd"))

# 查看前5条结果
date_df.show(5)

也可以直接通过Spark SQL语句快速实现:

SELECT explode(sequence(to_date('1900-01-01'), to_date('2030-12-31'), interval 1 day)) AS date_col

方法2:兼容旧版本PySpark(低于2.4)

如果你的Spark版本不支持sequence函数,可通过生成数字序列再转换为日期:

from pyspark.sql import SparkSession
from pyspark.sql.functions import expr

spark = SparkSession.builder.appName("DateRangeGenerator").getOrCreate()

start_date = "1900-01-01"
end_date = "2030-12-31"

# 计算起始到结束日期的总天数差
days_diff = spark.sql(f"SELECT datediff(to_date('{end_date}'), to_date('{start_date}')) AS diff").collect()[0]["diff"]

# 生成数字序列并转换为对应日期
date_df = spark.range(0, days_diff + 1) \
    .withColumn("date_col", expr(f"date_add(to_date('{start_date}'), id)")) \
    .select("date_col")

注意事项

  • date_col为DateType类型,Spark默认以yyyy-MM-dd格式显示;若需固定字符串格式,使用date_format函数转换即可。
  • 部分旧版本Spark对1900年这类早期日期的处理可能存在兼容性问题,建议测试边界日期(如1900-01-01、2030-12-31)的正确性。

内容的提问来源于stack exchange,提问作者Jamie Arodi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:43:29