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
相关产品推荐
相关产品推荐

