You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:41:13