使用pandas读取CSV设置index_col=0报错,求合并年月为日期索引方案
问题解决:合并年月列为日期索引并避免类型错误
错误原因分析
你遇到的Argument 'values' has incorrect type (expected numpy.ndarray, got Index)错误,是因为同时使用parse_dates=[['year', 'month']]和index_col=0时,pandas的日期解析逻辑出现冲突:index_col=0会把原CSV的第一列(No)设为索引,而parse_dates在处理合并列时,错误地将索引对象传入了date_parser函数,导致类型不匹配。
另外你提到执行代码后数据集还保留了No列,是因为index_col=0已经把No设为索引,后续drop('No', axis=1)自然无效——因为索引不在列的范围内。
解决方案
以下两种方法都能实现你的需求:生成年月格式的日期索引,仅保留gw、temp、evap列,且适合绘图场景。
方法一:分步处理(更直观)
先读取原始数据,再手动合并日期列并设置索引:
from datetime import datetime import pandas as pd # 1. 读取CSV,不提前设置索引或解析日期 dataset = pd.read_csv('data_test1.csv') # 2. 合并year和month为日期字符串,转成年月周期类型(适合绘图的时间轴处理) dataset['year_month'] = dataset.apply(lambda row: f"{row['year']} {row['month']}", axis=1) dataset['year_month'] = pd.to_datetime(dataset['year_month'], format='%Y %m').dt.to_period('M') # 3. 设置日期列为索引,删除冗余列 dataset.set_index('year_month', inplace=True) dataset.drop(['No', 'year', 'month'], axis=1, inplace=True) # 查看结果 print(dataset.head())
方法二:调整read_csv参数(更简洁)
避免同时使用parse_dates合并列和index_col,先解析日期列再设置索引:
from datetime import datetime import pandas as pd def parse(x): return datetime.strptime(x, '%Y %m') # 读取时合并year和month为日期列,不设置index_col dataset = pd.read_csv('data_test1.csv', parse_dates=[['year', 'month']], date_parser=parse) # 将合并后的日期列转成年月周期格式并设为索引 dataset.set_index(dataset['year_month'].dt.to_period('M'), inplace=True) # 删除冗余列 dataset.drop(['No', 'year_month'], axis=1, inplace=True) # 查看结果 print(dataset.head())
关键说明
- 用
pd.Period('M')生成的年月索引是专门的时间周期类型,比纯字符串更适合绘图时的时间轴排序、自动格式化。 - 如果一定要保留
YYYY MM的字符串格式,只需去掉转Period的步骤,直接用合并后的字符串作为索引即可。
内容的提问来源于stack exchange,提问作者Betabore
相关产品推荐
相关产品推荐

