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

Regex+strptime+Lambda处理日期代码运行正常但Pytest失败求助

排查与解决步骤

1. 明确转换逻辑的返回类型

datetime.datetime.strptime() 本身返回的是 datetime.datetime 对象,若你需要的是 datetime.date 类型,必须显式调用 .date() 方法。直接运行时打印出的日期字符串(如2024-05-20)会掩盖实际类型差异,这是测试失败的核心诱因之一。

检查你的Lambda转换代码:

  • 若返回datetime:
    df['date_col'] = df['raw_date'].apply(lambda x: datetime.strptime(re.search(r'\d{4}-\d{2}-\d{2}', x).group(), '%Y-%m-%d'))
    
  • 若返回date:
    df['date_col'] = df['raw_date'].apply(lambda x: datetime.strptime(re.search(r'\d{4}-\d{2}-\d{2}', x).group(), '%Y-%m-%d').date())
    

2. 对齐测试断言的类型

如果转换逻辑返回datetime.date,但测试断言用了datetime.datetime(或反之),必然会触发类型不匹配错误。统一两边的类型:

  • 若转换后是date类型,断言用datetime.date:
    assert df.loc[0, 'date_col'] == datetime.date(2024, 5, 20)
    
  • 若转换后是datetime类型,断言用带时分秒的datetime.datetime:
    assert df.loc[0, 'date_col'] == datetime.datetime(2024, 5, 20, 0, 0)
    

3. 排查列内类型不一致问题

Lambda应用后,列中可能混合了date和datetime类型(比如部分行转换逻辑分支不同)。执行以下代码检查列内所有元素的类型:

print(df['date_col'].apply(type).unique())

若输出包含两种类型,需修正转换逻辑,强制统一返回类型,比如所有行都转换为date:

def convert_date(raw_date):
    match = re.search(r'\d{4}-\d{2}-\d{2}', raw_date)
    if match:
        return datetime.strptime(match.group(), '%Y-%m-%d').date()
    return pd.NaT  # 用pandas空时间值统一类型

df['date_col'] = df['raw_date'].apply(convert_date)

4. 处理边缘情况

测试用例可能包含正则匹配失败的行,直接运行时未触发这类场景,但测试时会抛出异常或返回None,导致列类型混乱。在转换函数中添加异常捕获:

def convert_date(raw_date):
    try:
        match = re.search(r'\d{4}-\d{2}-\d{2}', raw_date)
        if match:
            return datetime.strptime(match.group(), '%Y-%m-%d').date()
    except (AttributeError, ValueError):
        return pd.NaT
    return pd.NaT

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:22:24