如何在Pandas中用strptime兼容两种时间格式解析CSV数据?
解决CSV时间列多格式解析报错问题
你的timeparse_1函数存在两个核心问题:
- 未接收目标参数:函数定义时没有将待解析的时间字符串作为参数传入,导致内部引用
x时触发NameError。 - finally块逻辑错误:finally语句块无论try执行成功与否都会强制执行,这意味着即便try里的格式解析成功,finally的代码也会覆盖返回结果,应该改用
except捕获解析失败的场景。
修正后的自定义解析函数
def timeparse_1(x): try: # 优先尝试解析带小时的格式 return datetime.strptime(x, '%H:%M:%S.%f') except ValueError: # 格式不匹配时,尝试分:秒.毫秒的格式 return datetime.strptime(x, '%M:%S.%f')
完整使用示例
将修正后的函数传入pd.read_csv的date_parser参数即可:
import pandas as pd from datetime import datetime def timeparse_1(x): try: return datetime.strptime(x, '%H:%M:%S.%f') except ValueError: return datetime.strptime(x, '%M:%S.%f') lap_times = pd.read_csv( 'data/lap_times.csv', parse_dates={'time_datetime': ['time']}, date_parser=timeparse_1 )
扩展优化方案
如果后续可能出现更多时间格式,可以通过遍历格式列表的方式批量尝试解析,提升兼容性:
def timeparse_1(x): # 按优先级排列可能的时间格式 time_formats = ['%H:%M:%S.%f', '%M:%S.%f', '%S.%f'] for fmt in time_formats: try: return datetime.strptime(x, fmt) except ValueError: continue # 所有格式匹配失败时,抛出明确错误 raise ValueError(f"无法解析时间字符串: {x}")
内容的提问来源于stack exchange,提问作者Andre Luiz Moura
相关产品推荐
相关产品推荐

