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

如何在Python中统一将多格式日期转为dd/mm/yyyy格式

Pandas多格式日期统一转换为dd/mm/yyyy格式问题解决

问题背景

需要将Pandas DataFrame的Date列统一格式化为dd/mm/yyyy,现有Date列包含三种日期格式:

  • 01/01/01(两位年份,需解析为2001年1月1日)
  • 01-02-2001(需解析为日01、月02、年2001)
  • March 1rd, 2001(英文月份格式)

当前代码将01-02-2001错误解析为2001年1月2日,ChatGPT提供的代码因向pd.to_datetime的format参数传入列表引发TypeError。

现有代码及问题

原始代码

import pandas as pd

data = {
    'Date': ['01/01/01', '01-02-2001', 'March 1rd, 2001'],    
    'Name': ['Ana', 'Bob', 'Carl']
}
df_data = pd.DataFrame(data)

# 转换为datetime类型
df_data['Date'] = pd.to_datetime(df_data['Date'])

# 转为dd/mm/yyyy格式
df_data['Date'] = df_data['Date'].dt.strftime("%d/%m/%Y")

实际输出

Date  Name
0  01/01/2001   Ana
1  02/01/2001   Bob
2  01/03/2001  Carl

期望输出

Date  Name
0  01/01/2001   Ana
1  01/02/2001   Bob
2  01/03/2001  Carl

错误的ChatGPT代码及报错

ChatGPT提供的代码尝试传入格式列表,但pd.to_datetime的format参数仅接受单个字符串,导致类型错误:

import pandas as pd

# 创建含多格式日期的示例DataFrame
data = {'Date': ['2022-01-01', '01-02-2022', '01/03/2022', '2022/04/01', '01-Apr-2022'], 'Name': ['Ana', 'Bob', 'Carl', 'Dave', 'Emma']}
df = pd.DataFrame(data)

# 定义可能的日期格式
date_formats = ["%Y-%m-%d", "%d-%m-%Y", "%m/%d/%Y", "%d/%m/%Y", "%d-%b-%Y"]

# 转换Date列为datetime格式
df['Date'] = pd.to_datetime(df['Date'], format=date_formats, errors='coerce')

print(df)

报错信息

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-1c5d1f56aa15> in <cell line: 11>()
      9 
     10 # Convert the 'Date' column to datetime format
---> 11 df['Date'] = pd.to_datetime(df['Date'], format=date_formats, errors='coerce')
     12 
     13 print(df)

1 frames
/usr/local/lib/python3.9/dist-packages/pandas/core/tools/datetimes.py in _convert_listlike_datetimes(arg, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
    386         # format because this path makes process slower in this
    387         # special case
---> 388         format_is_iso8601 = format_is_iso(format)
    389         if format_is_iso8601:
    390             require_iso8601 = not infer_datetime_format

TypeError: Argument 'f' has incorrect type (expected str, got list)

正确解决方案

通过指定dayfirst=True参数,让Pandas优先将短横线分隔的日期解析为日-月-年,同时Pandas能自动识别其他两种格式的日期。随后用strftime统一格式为dd/mm/yyyy:

import pandas as pd

data = {
    'Date': ['01/01/01', '01-02-2001', 'March 1rd, 2001'],    
    'Name': ['Ana', 'Bob', 'Carl']
}
df_data = pd.DataFrame(data)

# 转换为datetime类型,优先按日-月-年解析短横线分隔的日期
df_data['Date'] = pd.to_datetime(df_data['Date'], dayfirst=True)

# 统一格式为dd/mm/yyyy
df_data['Date'] = df_data['Date'].dt.strftime("%d/%m/%Y")

print(df_data)

输出结果

Date  Name
0  01/01/2001   Ana
1  01/02/2001   Bob
2  01/03/2001  Carl

补充说明

如果遇到更复杂的多格式场景,可以结合dateutil.parser.parse进行灵活解析(需先安装python-dateutil):

from dateutil import parser

df_data['Date'] = df_data['Date'].apply(lambda x: parser.parse(x, dayfirst=True))
df_data['Date'] = df_data['Date'].dt.strftime("%d/%m/%Y")

内容的提问来源于stack exchange,提问作者thi.sampai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:54:56