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

如何修复Python中datetime.strptime解析文件名时的ValueError

解决文件名拆分与时间解析的错误问题

问题根源分析

从报错信息和完整代码来看,主要存在两个关键问题:

  1. 函数返回值与DataFrame列顺序不匹配:sn_date_fromfile函数返回顺序是file_date, sn, pathname,但创建DataFrame时列定义为["sn", "file_time", "path_name"],导致数据错位,后续逻辑出现混乱。
  2. 文件名拆分逻辑不严谨:使用split("_")会拆分所有下划线,若文件名存在多个下划线,会导致sn_file[1]不是预期的日期部分;同时未处理文件名不符合格式的情况。

具体修复步骤

1. 修正DataFrame列与函数返回值的对应关系

调整DataFrame的列顺序,使其与函数返回值顺序一致:

file_meta = pd.DataFrame(
    [sn_date_fromfile(path) for path in paths],
    columns=["file_time", "sn", "path_name"],  # 顺序改为file_time在前,sn在后
    )

或者调换函数的返回顺序,保持列定义不变:

def sn_date_fromfile(pathname):
    filename = os.path.basename(pathname)
    sn_file = filename.split("_", 1)
    # ... 其他代码 ...
    return sn, file_date, pathname  # 调换sn和file_date的顺序

2. 优化文件名拆分逻辑

使用split("_", 1)仅拆分第一个下划线,确保即使文件名后续有下划线,也不会影响前两部分的提取;同时添加基础格式校验:

def sn_date_fromfile(pathname):
    filename = os.path.basename(pathname)
    # 只拆分第一个下划线,得到[sn, 日期+后缀]
    sn_file = filename.split("_", 1)
    
    # 校验拆分结果是否符合预期
    if len(sn_file) != 2:
        raise ValueError(f"文件名格式错误:{filename},需符合'sn_yyyymmddhhmmss.nc'格式")
    
    sn = sn_file[0]
    date_str = sn_file[1]
    # 解析时间,格式串匹配日期+后缀的结构
    file_date = dt.datetime.strptime(date_str, "%Y%m%d%H%M%S.nc")
    
    return file_date, sn, pathname

3. 可选:添加异常处理增强鲁棒性

如果目录中可能存在非目标格式的文件,可添加异常捕获跳过错误文件:

def sn_date_fromfile(pathname):
    filename = os.path.basename(pathname)
    sn_file = filename.split("_", 1)
    
    if len(sn_file) != 2:
        print(f"跳过不符合格式的文件:{filename}")
        return None, None, pathname
    
    sn = sn_file[0]
    date_str = sn_file[1]
    
    try:
        file_date = dt.datetime.strptime(date_str, "%Y%m%d%H%M%S.nc")
    except ValueError:
        print(f"文件{filename}的日期格式错误,无法解析")
        return None, None, pathname
    
    return file_date, sn, pathname

创建DataFrame后过滤无效数据:

file_meta = pd.DataFrame(
    [sn_date_fromfile(path) for path in paths],
    columns=["file_time", "sn", "path_name"],
    )
# 过滤无效行
file_meta = file_meta.dropna(subset=["file_time", "sn"])

额外检查点

  • 确认目标目录/Volumes/1A/file1下的所有.nc文件都严格遵循12080103_20220809191000.nc的格式,没有缺失下划线、日期格式错误的文件。
  • 查看print(sn_file)的输出,确认每个文件名拆分后的结果是否符合预期,快速定位异常文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:06:38