Pandas set_index未生效,如何将Time列设为DataFrame索引?
修复DataFrame设置索引未生效的问题
你的代码里df.set_index('Time')没有生效,核心原因是pandas的set_index方法默认返回一个新的DataFrame对象,不会直接修改原df。你没有将返回值重新赋值给df,所以原数据的索引完全没变化。另外,你后续还试图修改df['Time']列——如果索引设置成功,这列会被移出DataFrame的列列表,届时这段代码会报错。
修复方案1:重新赋值给原DataFrame
先格式化Time列,再将设置索引后的新对象赋值给df:
def save_to_csv(timestamps, values, lower, upper, query): df = pd.DataFrame({'Time': timestamps, f'Q50-{format_filename(query)}': values}) # 先格式化Time列的显示格式 df['Time'] = df['Time'].dt.strftime('%Y-%m-%dT%H:%M:%S') # 将设置索引后的新DataFrame赋值给原变量 df = df.set_index('Time') print(df.tail()) df.to_csv(f"predictions/pred-Q50-{format_filename(query)}.csv")
修复方案2:使用inplace=True参数
直接在原DataFrame上修改索引,无需重新赋值:
def save_to_csv(timestamps, values, lower, upper, query): df = pd.DataFrame({'Time': timestamps, f'Q50-{format_filename(query)}': values}) df['Time'] = df['Time'].dt.strftime('%Y-%m-%dT%H:%M:%S') # 用inplace=True直接修改原DataFrame df.set_index('Time', inplace=True) print(df.tail()) df.to_csv(f"predictions/pred-Q50-{format_filename(query)}.csv")
更高效的写法:创建DataFrame时直接指定索引
可以跳过先创建列再转索引的步骤,直接在初始化时设置索引,同时完成格式转换:
def save_to_csv(timestamps, values, lower, upper, query): # 先格式化时间戳 formatted_timestamps = timestamps.dt.strftime('%Y-%m-%dT%H:%M:%S') # 初始化时直接将格式化后的时间设为索引 df = pd.DataFrame( {f'Q50-{format_filename(query)}': values}, index=formatted_timestamps ) print(df.tail()) df.to_csv(f"predictions/pred-Q50-{format_filename(query)}.csv")
关键注意点
- pandas的大部分数据处理方法(如
set_index、drop、rename等)默认都是返回新对象,不会修改原始数据,这是为了避免误操作破坏原始数据。 - 如果先设置Time为索引,后续就不能再通过
df['Time']访问该列,所以必须先完成Time列的格式转换,再设置为索引。
内容的提问来源于stack exchange,提问作者Reb0rnX10
相关产品推荐
相关产品推荐

