pandas中pd.read_csv读取CSV的参数差异问题咨询
问题核心原因
两个读取结果的表现差异,本质是对pandas索引规则、resample接口逻辑不熟悉,加上dtype查看的认知盲区导致的:
resample的运行要求:pandas时间重采样方法默认以DataFrame的行索引作为时间基准计算,只有当行索引是DatetimeIndex类型时,才能直接无参调用;如果时间值只是普通列,哪怕列本身是datetime64类型,直接调用resample也会抛出类型错误。- 无法调取时间列的原因:第二种读取方式里你传入了
index_col=[0]参数,已经把位置0的时间列从普通数据列转为了行索引。行索引不属于df.columns覆盖的普通列范畴,自然没法通过df['时间列名']的常规列索引方式取值。 - dtypes显示一致的误区:调用
df.dtypes时只会返回所有普通列的字段类型,不会展示行索引的类型。第二种读取结果的行索引是datetime64[ns]类型的DatetimeIndex,第一种读取结果的行索引是默认的整数RangeIndex,二者索引类型完全不同,你之前没单独检查索引类型才会误以为字段类型完全一致。
注意:你贴的第二种读取代码里多写了一个连续的冗余逗号,运行时会触发语法错误,写代码时要删掉多余逗号。
对应场景解决方案
根据你后续的分析习惯选一种方式即可:
方案1:保留时间为行索引(时间序列分析推荐写法)
这种写法最简洁,不用每次调用时间序列方法都重复传列参数:
- 正确读取代码:
# 删掉多余逗号,index_col和parse_dates直接传列位置即可,列表包裹的写法也兼容 df = pd.read_csv('FileName.csv', index_col=0, parse_dates=0) - 时间值调取方法:直接通过
df.index即可获取全部时间序列,不需要按列名调用;如果需要把时间索引转回普通列,执行df = df.reset_index()即可。 - resample调用示例(按天重采样求均值):
df_daily = df.resample('D').mean()
方案2:保留时间为普通列
如果你习惯时间列作为普通字段存在,读文件时不要设置index_col,调用resample时显式指定时间列即可:
- 读取代码:
# 仅解析第0列为时间类型,不设为索引 df = pd.read_csv('FileName.csv', parse_dates=[0]) - resample调用示例(假设第0列列名为
record_time):# 通过on参数指定作为时间轴的列 df_daily = df.resample('D', on='record_time').mean()
内容的提问来源于stack exchange,提问作者Moody
相关产品推荐
相关产品推荐

