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

strptime日期格式化异常求助:无法处理含时分秒的日期转换

问题排查与解决方案

错误原因

  1. 正则匹配优先级错误:原代码中先检查短日期正则\d{4}-\d{2}-\d{2},带时分秒的日期字符串会被该正则匹配开头部分,导致程序用%Y-%m-%d格式去解析包含时分秒的完整字符串,剩余的 12:46:21无法被转换,触发ValueError。
  2. 未做目标格式转换:原函数返回的是datetime对象,若要得到%Y-%m-%d格式的字符串,需要额外格式化处理。

修复方案

方案一:修正自定义解析函数

调整正则检查顺序,使用全匹配确保规则匹配完整字符串,最后转换为目标格式:

from datetime import datetime
import re
import pandas as pd


def conv_date(dte: str) -> str:
    # 优先匹配带时分秒的长格式,避免短格式提前匹配
    acceptable_mappings = [
        (r"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}", "%Y-%m-%d %H:%M:%S"),
        (r"\d{4}-\d{2}-\d{2}", "%Y-%m-%d"),
    ]
    for regex, fmt in acceptable_mappings:
        # 用fullmatch确保整个字符串完全符合正则规则
        if re.fullmatch(regex, dte):
            dt = datetime.strptime(dte, fmt)
            # 转换为目标格式字符串
            return dt.strftime("%Y-%m-%d")
    raise Exception(f"Expected date in one of supported formats, got {dte}")


mock_dict = [
    {"name": "xx", "role": "loves only-fans", "date": "2023-07-26 12:46:21"},
    {"name": "dz", "role": "legend", "date": "2023-07-26"},
]

df = pd.DataFrame(mock_dict)

if __name__ == "__main__":
    print("原始数据:")
    print(df)
    # 替换原date列或新增date_clean列
    df['date'] = df['date'].apply(conv_date)
    print("\n处理后数据:")
    print(df)

运行结果:

原始数据:
  name             role                 date
0   xx  loves only-fans  2023-07-26 12:46:21
1   dz           legend           2023-07-26

处理后数据:
  name             role        date
0   xx  loves only-fans  2023-07-26
1   dz           legend  2023-07-26

方案二:使用Pandas内置函数简化处理

无需自定义正则和解析函数,Pandas的to_datetime可以自动识别多种日期格式,直接转换为目标格式:

import pandas as pd

mock_dict = [
    {"name": "xx", "role": "loves only-fans", "date": "2023-07-26 12:46:21"},
    {"name": "dz", "role": "legend", "date": "2023-07-26"},
]

df = pd.DataFrame(mock_dict)

df['date'] = pd.to_datetime(df['date']).dt.strftime("%Y-%m-%d")
print(df)

运行结果与方案一一致,代码更简洁高效。

内容的提问来源于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 23:48:19