Pandas多Excel Sheet按Timestamp对齐合并及groupby报错问题
问题根因与解决方案
报错的核心原因
你遇到的ValueError: Grouper for 'Timestamp' not 1-dimensional完全是拼接方式错误导致的:
- 每个独立读取的工作表都自带同名的
Timestamp列,直接用pd.concat(..., axis=1)横向拼接后,最终DataFrame里会存在多列完全重名的Timestamp字段 - 这种场景下你用
df['Timestamp']取出来的会是一个多列的二维DataFrame,而非1维的Series;执行.groupby('Timestamp')时,pandas会把所有匹配到的同名Timestamp列都作为分组键传入,得到的是多维的分组对象,自然触发维度不匹配的报错。
符合你需求的正确合并流程
你的核心目标是按Timestamp对齐所有不同采样频率的传感器数据,对低频传感器在两次采样的间隔时段,使用上一次的观测值顺延填充,正确的实现步骤如下:
- 预处理每个工作表,消除列名冲突、把Timestamp转为索引
遍历每个读入的工作表,统一做三个操作:把Timestamp转成标准datetime类型、将Timestamp设置为行索引、给当前传感器的数值列加上专属标识,避免不同表的数值列重名processed_sensor_dfs = [] for sensor_tag, raw_df in current_data.items(): # 转换Timestamp格式,避免字符串/数值类型不匹配导致的对齐错误 raw_df['Timestamp'] = pd.to_datetime(raw_df['Timestamp']) # 将Timestamp设为行索引 indexed_df = raw_df.set_index('Timestamp') # 给所有数值列加传感器标签,避免重名 indexed_df.columns = [f"{col}_{sensor_tag}" for col in indexed_df.columns] processed_sensor_dfs.append(indexed_df) - 外连接拼接所有传感器数据
用外连接模式横向拼接所有预处理好的表,取所有出现过的Timestamp的并集,完整保留高频传感器的全部采样时间点,不会丢失高频段的数据aligned_base = pd.concat(processed_sensor_dfs, axis=1, join='outer') - 按时间排序后做前向填充
先按时间索引做升序排序,再执行前向填充,实现低频传感器的数值顺延效果:在两个相邻的低频采样点之间,直接复用上一次的低频观测值填充对齐到高频的时间网格上# 避免时间乱序导致填充错位 aligned_base = aligned_base.sort_index() # 前向填充,匹配你要求的“沿用上次数值填充间隔时段”的逻辑 filled_dataset = aligned_base.ffill() # 丢弃最开头没有历史观测值的空行(可根据业务需求调整) filled_dataset = filled_dataset.dropna() - 恢复Timestamp为普通列
把索引位置的Timestamp转回普通列,此时整个数据集仅存在唯一的Timestamp列,后续做分组、统计操作都不会再触发维度报错final_dataset = filled_dataset.reset_index()
避坑提醒
- 初始拼接阶段不要使用内连接(
join='inner'),这种方式只会保留所有表都共有的Timestamp,会直接删掉高频传感器独有的采样点,完全失去对齐的意义 - 填充操作必须在时间排序完成后执行,乱序的索引会导致前向填充取到错误的历史值
- 不要在预处理阶段直接把Timestamp列删掉,对齐的核心依赖就是这个时间索引字段
内容的提问来源于stack exchange,提问作者Mihael Brkić
相关产品推荐
相关产品推荐

