求匹配所有日期格式的正则表达式,用于识别DataFrame日期列并转换类型
批量识别并转换DataFrame中的多格式日期列
我的DataFrame内部分列初始类型为object,这些列包含多种格式的日期值,需要编写能匹配所有以下日期格式的正则表达式,识别出这类日期列并将其转换为datetime类型。涉及的日期格式包括:
- 04/10/2022
- 10/04/2022
- 2022/04/10
- 2022/10/04
- 2022-12-20 00:00:00
- 04-10-2022
我尝试过的代码如下:
for columnIndex, colName in enumerate(df): df2 = pd.DataFrame() df2['test'] = df[colName] count = 0 for i, j in df2.iteritems(): for k in j: if re.match("[0-9]{2}/[0-9]{2}/[0-9]{4}", str(k)): count = count+1 if(count>5): df[colName] = pd.to_datetime(df[colName]) print(df.dtypes)
解决方案
匹配所有目标格式的正则表达式
可以用以下正则表达式覆盖所有给定的日期格式:
date_pattern = re.compile(r'^(?:\d{2}[-/]\d{2}[-/]\d{4}|\d{4}[-/]\d{2}[-/]\d{2}(?:\s\d{2}:\d{2}:\d{2})?)$')
正则说明:
\d{2}[-/]\d{2}[-/]\d{4}:匹配日/月/年、日-月-年、月/日/年、月-日-年这类短日期格式\d{4}[-/]\d{2}[-/]\d{2}(?:\s\d{2}:\d{2}:\d{2})?:匹配年/月/日、年-月-日格式,且支持后面带时分秒的扩展格式(如2022-12-20 00:00:00)
优化后的转换代码
原代码嵌套循环效率较低,且仅匹配了一种格式,优化后的代码如下:
import re import pandas as pd # 定义日期匹配正则 date_pattern = re.compile(r'^(?:\d{2}[-/]\d{2}[-/]\d{4}|\d{4}[-/]\d{2}[-/]\d{2}(?:\s\d{2}:\d{2}:\d{2})?)$') for col in df.columns: # 仅处理object类型的列 if df[col].dtype == 'object': # 统计列中符合日期格式的元素数量 match_count = df[col].astype(str).apply(lambda x: bool(date_pattern.match(x))).sum() # 按设定阈值判断是否转换 if match_count > 5: # 自动推断格式,转换失败的元素设为NaT df[col] = pd.to_datetime(df[col], errors='coerce') # 输出转换后的列类型 print(df.dtypes)
优化点说明:
- 只遍历
object类型列,减少无效处理 - 用
astype(str)统一转换为字符串,避免非字符串元素干扰匹配 - 用
apply结合lambda高效统计匹配数量,替代多层嵌套循环 - 利用
pd.to_datetime自动推断格式,errors='coerce'确保转换失败的元素转为NaT,避免程序报错
内容的提问来源于stack exchange,提问作者User2603
相关产品推荐
相关产品推荐

