从CSV导入Python后,DataFrame日期索引部分日期解析错误
问题描述
我需要在Python中分析一个包含两列(时间戳Timestamp、均值Mean)的DataFrame,加载CSV的代码如下:
df = pd.read_csv('L_strom_30974_gerundet.csv', sep=';', names=['Timestamp', 'Mean']) df['Timestamp'] = pd.to_datetime(df.Timestamp,format= '%d.%m.%y %H:%M', infer_datetime_format=True) df.set_index('Timestamp', inplace=True) df.index = pd.DatetimeIndex(df.index).to_period('15T') df = df.sort_index()
遇到的问题:CSV原始日期范围仅为2009-01-01 00:00至2010-10-04 23:45,但导入后在绘图和df.info中出现了2010年11月、12月的日期:
PeriodIndex: 61628 entries, 2009-01-01 00:00 to 2010-12-09 23:45 Freq: 15T Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Mean 61628 non-null float64 dtypes: float64(1)
CSV中未找到该时间段的数据,且df.info的条目数与CSV行数一致,推测是部分日期解析错误。导入后DataFrame的尾部数据如下:
Mean Timestamp 2010-12-09 22:45 186 2010-12-09 23:00 206 2010-12-09 23:15 168 2010-12-09 23:30 150 2010-12-09 23:45 132
想请教为何大部分日期解析正确,仅部分出错?
问题分析与解决建议
核心原因
你同时使用了format='%d.%m.%y %H:%M'和infer_datetime_format=True两个参数,这是矛盾的:
format参数是强制pandas用指定格式解析日期infer_datetime_format=True会让pandas在按指定格式解析失败时,自动尝试推断其他日期格式
CSV中可能存在少数日期的格式和你指定的%d.%m.%y不匹配(比如部分行把日和月的顺序写反了,或者年份格式不一致),当这些行按指定格式解析失败时,pandas会自动推断格式,导致日期被错误解析成2010年11、12月的日期。
排查与解决步骤
关闭自动推断,强制指定格式
修改日期解析代码,去掉infer_datetime_format=True,并添加errors='coerce'让解析失败的日期转为NaT(Not a Time),方便定位问题行:df['Timestamp'] = pd.to_datetime(df.Timestamp, format='%d.%m.%y %H:%M', errors='coerce')定位错误行
筛选出Timestamp为NaT的行,查看对应的原始日期字符串,就能找到格式不匹配的内容:bad_rows = df[df['Timestamp'].isna()] print(bad_rows)修正解析规则
根据找到的错误格式,调整解析逻辑:- 如果只是少数行格式错误,可以手动修正CSV中的内容
- 如果存在多种格式,可以指定格式列表让pandas依次尝试:
df['Timestamp'] = pd.to_datetime(df.Timestamp, format=['%d.%m.%y %H:%M', '%m.%d.%y %H:%M'], errors='coerce')
验证结果
解析完成后,检查日期范围是否符合预期:print(df['Timestamp'].min(), df['Timestamp'].max())
内容的提问来源于stack exchange,提问作者Julius B
相关产品推荐
相关产品推荐

