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

如何将DataFrame单列多格式日期时间转换为标准格式?

多格式日期时间列的标准化转换方案

问题场景

现有DataFrame的datetime列包含两种主要格式,同时存在脏数据:

df.datetime.head(9)
# 输出:
0    03 Mar 2023 00:00 ## Its a 24 hr format
1    03 Mar 2023 00:00
2    03 Mar 2023 00:00
3    03 Mar 2023 00:00
5    03 Mar 2023 00:00
6    2020-02-07 00:00:00
7    2020-02-02 22:00:00
8    2020-02-02 00:00:00
9    2020-02-02 22:00:00

期望转换为统一格式:2020-02-02 22:00:00。

直接执行pd.to_datetime(df['datetime'])时,因存在03 Mar 2023 90+ '这类异常值报错:

dateutil.parser._parser.ParserError: Unknown string format: 03 Mar 2023 90+ '

添加errors='coerce'参数后,部分数据看似丢失时间(实际datetime类型仍包含时间,仅默认显示省略),同时出现NaT值。


高效转换方案

1. 先清理脏数据

先移除字符串中的注释、特殊字符和无效内容,避免解析失败:

# 移除行内注释(##开头的内容)
df['datetime'] = df['datetime'].str.replace(r'##.*$', '', regex=True).str.strip()
# 移除所有非日期时间相关的特殊字符
df['datetime'] = df['datetime'].str.replace(r'[^0-9A-Za-z :\-]', '', regex=True).str.strip()

2. 指定多格式精准解析

针对已知的两种格式,传入格式列表让pandas精准匹配,避免自动解析的不确定性,同时保留完整时间信息:

# 定义已知的日期时间格式
target_formats = [
    '%d %b %Y %H:%M',  # 对应03 Mar 2023 00:00格式
    '%Y-%m-%d %H:%M:%S' # 对应2020-02-07 00:00:00格式
]

# 执行转换,仅对无法匹配的内容转为NaT
df['datetime'] = pd.to_datetime(df['datetime'], format=target_formats, errors='coerce')

3. 验证并处理剩余NaT

检查转换后仍为NaT的行,确认是否还有未覆盖的格式或脏数据:

# 筛选出转换失败的行
invalid_rows = df[df['datetime'].isna()]
print(invalid_rows)

4. 统一格式显示(可选)

如果需要将datetime列显示为指定格式的字符串,可添加格式化列:

df['datetime_formatted'] = df['datetime'].dt.strftime('%Y-%m-%d %H:%M:%S')

关键说明

  • 之前出现的"时间丢失"是pandas的显示优化:当时间为00:00:00时,默认只显示日期,但实际datetime类型仍包含完整的时间信息,可通过df['datetime'].dt.hour等属性验证。
  • 指定格式列表解析比自动推断效率更高,尤其在数据量较大时。

内容的提问来源于stack exchange,提问作者Rander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:02