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

求匹配所有日期格式的正则表达式,用于识别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)

优化点说明:

  1. 只遍历object类型列,减少无效处理
  2. 用astype(str)统一转换为字符串,避免非字符串元素干扰匹配
  3. 用apply结合lambda高效统计匹配数量,替代多层嵌套循环
  4. 利用pd.to_datetime自动推断格式,errors='coerce'确保转换失败的元素转为NaT,避免程序报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:05:20