如何在不改动其他列的前提下重采样DataFrame的Time_Instant列?
解决Pandas重采样时"The grouper name Time_Instant is not found"报错问题
问题背景
你想要对DataFrame的Measurement列按3小时间隔重采样,同时保留Sensor_ID列不变。你的原始输入数据是:
Sensor_ID Time_Instant Measurement 0 14121 2013/11/14 17:00 0.8 1 14121 2013/11/14 18:00 0.6 2 14121 2013/11/14 19:00 0.4 3 14121 2013/11/14 20:00 0.4 4 14121 2013/11/14 21:00 0
期望得到的重采样结果是:
Sensor_ID Time_Instant Measurement 0 14121 2013/11/14 00:00:00 0.8 1 14121 2013/11/14 03:00:00 0.6 2 14121 2013/11/14 06:00:00 0.4 3 14121 2013/11/14 09:00:00 0.4 4 14121 2013/11/14 12:00:00 0
但运行你写的代码时,出现了报错:'The grouper name Time_Instant is not found'。
报错原因分析
你犯了一个关键的小错误:你把DataFrame的列名转换成了datetime类型,而不是把Time_Instant这一列的内容转换成datetime类型。
这段代码Mi_Meteo.columns = pd.to_datetime(Mi_Meteo.columns ,errors='coerce' )会把你的列名(比如Time_Instant)尝试转成datetime,结果Time_Instant这个列名被转成了无效的datetime值(或者直接丢失了原列名),导致后续resample找不到名为Time_Instant的分组列。
解决步骤与完整代码
要实现你的需求,只需要修正类型转换的对象,再指定正确的聚合逻辑即可:
import pandas as pd # 构造你的原始数据(如果已有DataFrame可以跳过这一步) data = { 'Sensor_ID': [14121]*5, 'Time_Instant': ['2013/11/14 17:00', '2013/11/14 18:00', '2013/11/14 19:00', '2013/11/14 20:00', '2013/11/14 21:00'], 'Measurement': [0.8, 0.6, 0.4, 0.4, 0] } Mi_Meteo = pd.DataFrame(data) # 正确操作:把Time_Instant列的内容转换成datetime类型 Mi_Meteo['Time_Instant'] = pd.to_datetime(Mi_Meteo['Time_Instant'], errors='coerce') # 重采样:按3小时间隔,从当天0点开始划分区间,指定各列的聚合方式 resampled_df = Mi_Meteo.resample( '3H', on='Time_Instant', origin='start_day' # 确保重采样从当天0点开始 ).agg({ 'Sensor_ID': 'first', # 因为所有Sensor_ID都是同一个值,用first保留原始值 'Measurement': 'sum' # 对Measurement列求和 }).reset_index() # 把Time_Instant从索引变回普通列 print(resampled_df)
代码说明
- 类型转换修正:
Mi_Meteo['Time_Instant'] = pd.to_datetime(...)会把该列的字符串时间转成datetime类型,这是resample能正常工作的前提。 - 重采样起始点:
origin='start_day'参数让重采样从当天的0点开始划分时间区间,这样你的17-21点数据会被对应到0点、3点等区间(和你的期望输出格式一致)。 - 多列聚合:
agg()方法可以为不同列指定不同的聚合逻辑,避免Sensor_ID被错误求和,保证它保留原始值。 - 重置索引:
reset_index()把重采样后作为索引的Time_Instant变回普通列,让输出格式和你期望的一致。
内容的提问来源于stack exchange,提问作者Dimi
相关产品推荐
相关产品推荐

