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

Databricks中Spark DataFrame日期格式转换问题求助

解决Databricks中'yyyy-MM'格式日期转'yyyy-MM-01'的问题

你的代码没达到预期的核心原因是:yyyy-MM格式的日期本身就包含'-',所以when(col('Start').contains('-'), col('Start'))这个分支会一直触发,永远不会执行拼接'-01'的逻辑。

下面给你几种可行的解决方案:

方法一:通过字符串长度判断

利用yyyy-MM是7位字符、yyyy-MM-dd是10位字符的特点来区分格式:

from pyspark.sql.functions import col, concat, lit, when

new_df = clinicaltrial_df.withColumn(
    'Start_new',
    when(
        col('Start').length() == 7,  # 匹配yyyy-MM格式
        concat(col('Start'), lit('-01'))
    ).otherwise(
        col('Start')  # 已有日部分,直接保留
    )
).withColumn(
    'Complete_new',
    when(
        col('Completion').length() == 7,
        concat(col('Completion'), lit('-01'))
    ).otherwise(
        col('Completion')
    )
)

new_df.show(5)

方法二:用正则表达式精准匹配

正则可以更严格地校验日期格式,避免误处理其他带'-'的异常字符串:

from pyspark.sql.functions import col, regexp_replace

new_df = clinicaltrial_df.withColumn(
    'Start_new',
    regexp_replace(col('Start'), r'^(\d{4}-\d{2})$', r'$1-01')
).withColumn(
    'Complete_new',
    regexp_replace(col('Completion'), r'^(\d{4}-\d{2})$', r'$1-01')
)

new_df.show(5)

方法三:转换为日期类型再格式化(推荐)

这种方法不仅能完成格式转换,还能自动校验日期的有效性,避免无效值:

from pyspark.sql.functions import col, to_date, date_format

new_df = clinicaltrial_df.withColumn(
    'Start_new',
    date_format(to_date(col('Start'), 'yyyy-MM'), 'yyyy-MM-dd')
).withColumn(
    'Complete_new',
    date_format(to_date(col('Completion'), 'yyyy-MM'), 'yyyy-MM-dd')
)

new_df.show(5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:53:23