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

