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

