如何将PySpark/Pandas DataFrame中多格式日期列转换为DD/MM/YYYY格式
解决方法
Pandas 处理方案
你之前的代码存在两个核心问题:
- 语法错误:
format参数的引号没有闭合 - 指定了单一的
%d-%m-%y格式,无法匹配输入列中多种不同的日期格式,也无法处理Excel导出时产生的数字格式日期序列号
完整实现代码
import pandas as pd # 第一步:自动识别所有格式的日期,包含Excel数字序列号 df['temp_datetime'] = pd.to_datetime(df['Before'], errors='coerce', infer_datetime_format=True) # 处理识别失败的Excel日期序列号(如果存在的话) excel_epoch = pd.Timestamp('1899-12-30') mask = df['temp_datetime'].isna() & df['Before'].str.isnumeric() df.loc[mask, 'temp_datetime'] = excel_epoch + pd.to_timedelta(df.loc[mask, 'Before'].astype(int), unit='D') # 第二步:格式化为 DD/MM/YYYY 字符串格式 df['After'] = df['temp_datetime'].dt.strftime('%d/%m/%Y') # 可选:删除临时中间列 df = df.drop('temp_datetime', axis=1)
如果你明确知道输入的所有日期格式,也可以手动指定格式列表提高识别准确率:
formats = ['%d-%m-%Y', '%d/%m/%Y', '%Y-%m-%d', '%m/%d/%y'] for fmt in formats: mask = df['temp_datetime'].isna() df.loc[mask, 'temp_datetime'] = pd.to_datetime(df.loc[mask, 'Before'], format=fmt, errors='coerce')
Spark 处理方案
如果使用Spark DataFrame,可以通过coalesce尝试多种日期格式,再统一格式化输出:
from pyspark.sql import functions as F from pyspark.sql.types import DateType # 列出所有可能的输入日期格式 date_formats = ['dd-MM-yy', 'dd/MM/yyyy', 'yyyy-MM-dd', 'MM/dd/yy'] # 生成尝试所有格式的表达式 parse_expr = F.coalesce(*[F.to_date(F.col('Before'), fmt) for fmt in date_formats]) # 补充处理Excel数字序列号 parse_expr = F.coalesce( parse_expr, F.to_date(F.expr("date_add(to_date('1899-12-30'), cast(Before as int))")) ) # 转换并格式化输出为目标格式 df = df.withColumn('After', F.date_format(parse_expr, 'dd/MM/yyyy'))
内容的提问来源于stack exchange,提问作者EnigmAI
相关产品推荐
相关产品推荐

