Pandas:分组DataFrame中查找最值对应的原始时间戳
解决方法:按日分组获取温度最值及对应时间戳
嘿,这个需求用Pandas的分组聚合就能轻松实现,核心是利用idxmax()/idxmin()找到组内最值的位置,再提取对应的时间戳就行。下面给你两种实用的方案,适合不同场景:
方案一:用apply处理分组(直观易读)
如果你的数据量不是特别大,这种方式最容易理解,每个分组的逻辑一目了然:
import pandas as pd # 第一步:确保timestamp是datetime类型(如果还不是的话) df['timestamp'] = pd.to_datetime(df['timestamp']) # 按日期分组,计算每日最值及对应时间戳 daily_stats = df.groupby(df['timestamp'].dt.date).apply( lambda group: pd.Series({ 'Tmax': group['T-C'].max(), 'Tmax_timestamp': group['timestamp'].iloc[group['T-C'].idxmax()], 'Tmin': group['T-C'].min(), 'Tmin_timestamp': group['timestamp'].iloc[group['T-C'].idxmin()] }) )
说明:
groupby(df['timestamp'].dt.date):把数据按日期(忽略时分秒)分组- 每个
group就是当天的子DataFrame,用group['T-C'].idxmax()拿到组内温度最高值的位置索引,再用iloc取出对应的时间戳 - 如果某天有多个相同的最值(比如你样本里1月2日00:00和01:00都是1.1℃),
idxmax()会返回第一个出现的位置,符合常规需求
方案二:用agg聚合(高效适合大数据)
如果你的数据量很大(数千条甚至更多),agg的效率比apply更高,推荐用这种方式:
import pandas as pd # 第一步:转换时间格式并新增日期列 df['timestamp'] = pd.to_datetime(df['timestamp']) df['date'] = df['timestamp'].dt.date # 聚合计算 daily_stats = df.groupby('date').agg( Tmax=('T-C', 'max'), Tmin=('T-C', 'min'), Tmax_timestamp=('timestamp', lambda x: x[df.loc[x.index, 'T-C'] == x.max()].iloc[0]), Tmin_timestamp=('timestamp', lambda x: x[df.loc[x.index, 'T-C'] == x.min()].iloc[0]) )
说明:
- 新增
date列是为了分组更直观,和直接用dt.date分组效果一致 - 聚合函数里的lambda逻辑:先筛选出组内温度等于最值的行,再取第一个对应的时间戳
结果示例
针对你提供的样本数据,最终得到的daily_stats会是这样的结构:
| date | Tmax | Tmax_timestamp | Tmin | Tmin_timestamp |
|---|---|---|---|---|
| 2015-01-01 | -2.0 | 2015-01-01 05:00:00 | -2.5 | 2015-01-01 00:00:00 |
| 2015-01-02 | 1.1 | 2015-01-02 00:00:00 | 0.5 | 2015-01-02 03:00:00 |
内容的提问来源于stack exchange,提问作者Fabio Capezzuoli
相关产品推荐
相关产品推荐

