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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:40:33