Pandas如何按ID和日期分组计算各站点每日温度最大值
解决方案
核心问题是你没有先将精确到秒的时间戳转换为自然日粒度的分组键,直接使用原始Date列分组时,每条不同时间点的记录都会被判定为独立分组,自然无法得到「单站点+单日」维度的聚合结果。
实现步骤:
- 从
Date列提取自然日维度作为第二个分组键 - 同时传入
ID和自然日两个维度作为分组依据 - 使用
transform方法将分组计算得到的最大值直接映射回原表每行,无需额外合并操作即可生成新列
完整可运行代码如下:
import pandas as pd # 测试用示例数据 df = pd.DataFrame({ 'Date': pd.to_datetime([ '2022-05-12 22:09:35+00:00', '2022-05-12 23:15:02+00:00', '2022-05-13 08:22:11+00:00', '2022-05-12 22:09:42+00:00', '2022-05-13 09:05:47+00:00' ]), 'ID': [1, 1, 1, 2, 2], 'Value': [18.3, 19.1, 20.5, 18.0, 21.2] }) # 核心计算逻辑:按ID+自然日分组计算单日单站最高温,直接生成新列 df['station_daily_max'] = df.groupby( [ 'ID', df['Date'].dt.date # 从带时间的时间戳中提取自然日 ] )['Value'].transform('max')
运行后得到的结果:
| Date | ID | Value | station_daily_max |
|---|---|---|---|
| 2022-05-12 22:09:35+00:00 | 1 | 18.3 | 19.1 |
| 2022-05-12 23:15:02+00:00 | 1 | 19.1 | 19.1 |
| 2022-05-13 08:22:11+00:00 | 1 | 20.5 | 20.5 |
| 2022-05-12 22:09:42+00:00 | 2 | 18.0 | 18.0 |
| 2022-05-13 09:05:47+00:00 | 2 | 21.2 | 21.2 |
注意事项
- 带时区的时间戳优先用
dt.date提取自然日,不要用dt.normalize(),避免时区自动转换导致日期归属错误 - 优先使用
transform而非groupby().max()后merge的写法,性能更好,也不会出现索引对齐导致的数值匹配错误
内容的提问来源于stack exchange,提问作者Vilerala
相关产品推荐
相关产品推荐

