按24行分组计算日均温:Pandas DataFrame分组报错及列丢失问题
解决按坐标+日期计算日均温的问题
Hey there! 针对你要给每个坐标对计算日均温的需求,最靠谱的方案是直接按「日期+纬度+经度」分组,而不是靠行索引整除来凑24行,这样既准确又能保留你需要的所有列。
最优代码实现
首先确认time列是datetime类型(如果还没转的话),然后直接分组计算:
import pandas as pd # 确保time列为datetime格式(如果原始数据不是的话) df['time'] = pd.to_datetime(df['time']) # 按日期、纬度、经度分组,计算t2m的均值,同时不设置为索引 daily_avg_temp = df.groupby( [df['time'].dt.date, 'latitude', 'longitude'], as_index=False )['t2m'].mean() # 可选:把date类型转回datetime格式,和原数据格式统一 daily_avg_temp['time'] = pd.to_datetime(daily_avg_temp['time'])
运行后得到的结果就完全符合你的期望:time列保留日期部分,latitude和longitude完整保留,t2m是对应坐标当日24小时的平均温度。
聊聊你之前方法的问题
- 最初用
df.index//N报错,是因为你的索引是DatetimeIndex,这种时间类型的索引不支持整数整除操作,所以触发了TypeError。 - 重置索引后用
df.index//N分组,虽然能按24行切分,但无法保证每个分组是同一坐标的同一天数据——如果你的数据排序有波动(比如不同坐标的小时数据穿插),这种分组会直接算错。而且分组时time列被当成数值列计算了均值,自然丢失了有效的日期信息。 - 后来加了
latitude和longitude分组,但还是依赖行索引整除,本质上还是没利用时间本身的日期属性,所以依然丢失了time列的有效信息。
补充:如果time是DataFrame的索引
从你给出的df.head输出看,time是DataFrame的索引,那可以先把索引转成列再处理:
# 把索引转为普通列 df = df.reset_index() df['time'] = pd.to_datetime(df['time']) # 后续分组代码和上面一样 daily_avg_temp = df.groupby( [df['time'].dt.date, 'latitude', 'longitude'], as_index=False )['t2m'].mean() daily_avg_temp['time'] = pd.to_datetime(daily_avg_temp['time'])
这样就能完美得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者JavierSando
相关产品推荐
相关产品推荐

