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

基于MultiIndex与多列的Pandas数据重采样问题

解决方法:将多记录传感器数据聚合为每日一行

嘿,这个需求在传感器数据处理里太常见了!咱们直接来一步步搞定它~

首先明确你的数据结构:ID(传感器编号)和date(日期)是MultiIndex,每个(ID, date)组合下有多条测量记录,目标是每个传感器每天只保留一行数据。这里核心是对每个传感器的每日数据做聚合,常用的方法有两种,按需选择即可:

方法一:直接用groupby聚合(最高效)

因为你的date已经是天级别的索引了,直接按MultiIndex的两个层级分组,然后选择你需要的聚合方式就行,比如取平均值、第一条/最后一条记录、最大值/最小值等:

import pandas as pd

# 先确保date是datetime类型(如果原始数据是字符串格式的话)
df.index = df.index.set_levels(pd.to_datetime(df.index.get_level_values('date')), level='date')

# 1. 取当日所有测量值的平均值(最常用的聚合方式)
df_daily_mean = df.groupby(level=['ID', 'date']).mean()

# 2. 保留当日第一条测量记录
df_daily_first = df.groupby(level=['ID', 'date']).first()

# 3. 保留当日最后一条测量记录
df_daily_last = df.groupby(level=['ID', 'date']).last()

# 4. 取当日测量值的最大值
df_daily_max = df.groupby(level=['ID', 'date']).max()

举个实际例子:你提供的ID=1在2016-02-07有两条记录,用mean()聚合后,m_1会是(11 + 10.4)/2 = 10.7,m_2是(3.3 + 2.8)/2 = 3.05,完美得到每日一行的精简数据。

方法二:用resample(适合需调整时间频率的场景)

如果你之后可能需要调整时间粒度(比如从天转周/月),或者更习惯用resample的逻辑处理时间序列,也可以这么操作:

# 先把MultiIndex重置为普通列,方便后续处理
df_reset = df.reset_index()
# 确保date是datetime类型
df_reset['date'] = pd.to_datetime(df_reset['date'])

# 按ID分组,对date按天重采样,选择聚合方式(这里用均值)
df_resampled = df_reset.groupby('ID').resample('D', on='date').mean()

# 恢复原来的MultiIndex结构(ID和date作为双层索引)
df_resampled = df_resampled.droplevel(0).set_index('ID', append=True).swaplevel(0, 1)

不过这种方法比groupby多了几步索引转换,如果你只是单纯要做每日聚合,方法一的效率会更高。

重要提醒:不管用哪种方法,一定要确保date列/索引是datetime类型,否则分组或重采样都会出错!如果原始date是字符串格式,一定要先用pd.to_datetime()转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:16:12