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

如何将PySpark/Pandas DataFrame中多格式日期列转换为DD/MM/YYYY格式

解决方法

Pandas 处理方案

你之前的代码存在两个核心问题:

  1. 语法错误:format参数的引号没有闭合
  2. 指定了单一的%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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:04