Python:查找日期索引DataFrame中每月传感器最小值所在行
解决按月份提取传感器最小值对应完整行的问题
嗨,我来帮你搞定这个需求!你需要从以日期为索引的DataFrame里,找出每个月Sensors值最小的完整行(也就是该行的所有参数),咱们先聊聊你之前试的几种方法为啥没达到预期,再给你正确的实现方式。
你之前尝试的方法问题分析
- 第一种代码:
optimization = r.loc[[r.index.month == month]] optimization=r.loc[r['Sensors'].idxmin()]
这里的问题是,r.index.month == month需要指定具体的月份值(比如1代表1月),而且后面的r['Sensors'].idxmin()是取整个DataFrame中Sensors最小的行,不是分月计算的,最终只能得到全局最小的那一行,不是每个月的结果。 - 第二种代码:
optimization=DataFrame(r.resample('M').Sensors.min())
这个方法确实能得到每个月的最小Sensors值,但只保留了这一列,丢失了其他列(比如ACH_Base、Am等)的信息,没法拿到完整的参数集合。 - 第三种代码:
optimization=r.loc[r['Sensors'].idxmin()]
和第一种的后半段一样,只能拿到全局Sensors最小的那一行,不是分月的结果。 - 第四种代码:
optimization= r.loc[r.groupby([r.index.month == month])["Sensors"].idxmin()]r.index.month == month是一个布尔判断,分组的是“等于指定月份”和“不等于指定月份”两组,不是按每个自然月分组,所以结果完全不符合预期。
正确的实现方式
首先要确保你的DataFrame索引是DatetimeIndex(日期时间类型),如果还不是的话,先转换:
import pandas as pd r.index = pd.to_datetime(r.index)
场景1:不区分年份(比如所有1月的数据放一起取最小)
按月份分组,提取每个组内Sensors最小的完整行:
optimization = r.loc[r.groupby(r.index.month)['Sensors'].idxmin()]
原理:r.groupby(r.index.month)把数据按1-12月分成12组,['Sensors'].idxmin()获取每个组内Sensors值最小的行的索引,最后用loc取出这些行,保留所有列的信息。
场景2:区分年份(比如2023年1月和2024年1月分开计算)
如果你的数据跨年度,需要按“年-月”分组,有两种写法:
写法一:按年和月分组
optimization = r.loc[r.groupby([r.index.year, r.index.month])['Sensors'].idxmin()]
写法二:用resample更简洁
利用resample('M')按自然月重采样,再用apply提取每个月的目标行:
optimization = r.resample('M').apply(lambda x: x.loc[x['Sensors'].idxmin()])
这个方法会自动按每个自然月分组,并且保留所有列的完整数据。
示例测试
这里给你一个可运行的示例,方便你验证:
import pandas as pd import numpy as np # 创建模拟数据:60天的日期索引,包含Sensors、ACH_Base、Am列 dates = pd.date_range('2023-01-01', periods=60, freq='D') df = pd.DataFrame({ 'Sensors': np.random.randint(1, 100, size=60), 'ACH_Base': np.random.rand(60), 'Am': np.random.rand(60) }, index=dates) # 按年-月提取Sensors最小的完整行 result = df.loc[df.groupby([df.index.year, df.index.month])['Sensors'].idxmin()] print(result)
内容的提问来源于stack exchange,提问作者Maryam Nahid
相关产品推荐
相关产品推荐

