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

Pandas中列名为多层对象时的调用及时间转换问题

问题解决:多层表头DataFrame的列名访问与时间格式转换

一、处理多层列名问题

你的DataFrame列名是MultiIndex(多层索引),从提供的字典可见,列名均为元组形式,比如('RECORD', 'Unnamed: 0_level_1')、('TIME/DATE', 'Unnamed: 1_level_1')。

1. 快速简化列名(推荐)

如果第二行表头都是无效的Unnamed内容,直接提取第一行作为唯一列名:

# 将多层索引的第一层设为新列名
df.columns = df.columns.get_level_values(0)

处理后列名变为单层的RECORD、TIME/DATE、ALARM OR MESSAGE,后续用df.loc[:, "RECORD"]或df["RECORD"]即可正常访问列。

2. 保留多层列名的访问方式

若需保留多层结构,访问列时需用元组指定完整层级:

  • 访问单个列:df[('TIME/DATE', 'Unnamed: 1_level_1')]
  • 用loc筛选行:df.loc[df[('RECORD', 'Unnamed: 0_level_1')] == 1]

二、时间格式转换报错的解决

报错源于两个问题:一是列名是多层结构,直接写df['TIME/DATE']无法匹配;二是指定的时间格式与实际字符串不匹配。

正确转换代码

先处理列名后,用匹配的格式转换:

# 先简化列名(使用上述方法)
df.columns = df.columns.get_level_values(0)
# 原时间字符串格式为"时分秒.毫秒  月/日/两位年份",对应格式符如下
df['TIME'] = pd.to_datetime(df['TIME/DATE'], format='%H:%M:%S.%f  %m/%d/%y')

若保留多层列名,需用完整列名元组:

df['TIME'] = pd.to_datetime(df[('TIME/DATE', 'Unnamed: 1_level_1')], format='%H:%M:%S.%f  %m/%d/%y')

其中%y对应两位年份(如22代表2022),%f对应毫秒部分,与你的时间字符串完全匹配,可避免报错。

补充:导入数据时避免多层表头

下次用read_csv导入时,若仅第一行是有效表头,直接指定header=0即可,无需设置header=[0,1]:

df = pd.read_csv('your_file.csv', header=0)

内容的提问来源于stack exchange,提问作者user3042850

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:03:15