如何修复Python中datetime.strptime解析文件名时的ValueError
解决文件名拆分与时间解析的错误问题
问题根源分析
从报错信息和完整代码来看,主要存在两个关键问题:
- 函数返回值与DataFrame列顺序不匹配:
sn_date_fromfile函数返回顺序是file_date, sn, pathname,但创建DataFrame时列定义为["sn", "file_time", "path_name"],导致数据错位,后续逻辑出现混乱。 - 文件名拆分逻辑不严谨:使用
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
相关产品推荐
相关产品推荐

