如何利用Pandas从日期时间型DataFrame中提取各年度最高温度?
解决方法:按年份提取最高温度
嘿,作为Python新手,你其实不用手动遍历年份列表这么麻烦——Pandas本身就有非常简洁的分组方法来搞定这个需求!我来一步步给你讲清楚:
最优方案:使用groupby直接分组计算
这是最简洁高效的方式,一行代码就能得到每年的最高温度:
import pandas as pd # 按年份分组,计算每组的最高温度 yearly_max_temp = df.groupby(df['Date'].dt.year)['Average Daily Value'].max() # 如果想转换成更直观的DataFrame格式 yearly_max_temp = yearly_max_temp.reset_index(name='Max Temperature (°C)')
这段代码的逻辑很清晰:
df['Date'].dt.year提取出每条记录的年份groupby()按年份把数据分成18个组(对应1990-2018)- 对每个组的
Average Daily Value列调用max(),得到该年份的最高温 reset_index()把结果转换成标准的DataFrame结构,方便查看和后续处理
如果需要获取最高温对应的具体日期
如果你还想知道每年的最高温是哪一天出现的,可以用idxmax()获取对应行的索引,再用loc提取整行数据:
# 获取每年最高温对应的完整记录 yearly_max_details = df.loc[df.groupby(df['Date'].dt.year)['Average Daily Value'].idxmax()] # 可以选择只保留需要的列 yearly_max_details = yearly_max_details[['Date', 'Average Daily Value']].rename(columns={'Average Daily Value': 'Max Temperature (°C)'})
为什么你的循环会得到全局最高值?
你之前的问题应该出在循环里没有过滤对应年份的数据。比如错误的写法可能是这样的:
# 错误示例:没有筛选当前年份,取了全局最大值 years = sorted(set(df['Date'].dt.year.to_list())) max_temps = [] for y in years: # 这里直接取了整个数据集的max,而不是当前年份的 max_temp = df['Average Daily Value'].max() max_temps.append(max_temp)
如果一定要用循环实现(虽然不推荐,效率不如groupby),正确的写法应该是先筛选出当前年份的数据,再取最大值:
years = sorted(set(df['Date'].dt.year.to_list())) yearly_max = {} for year in years: # 筛选出当前年份的所有记录 current_year_data = df[df['Date'].dt.year == year] # 计算该年份的最高温 current_max = current_year_data['Average Daily Value'].max() yearly_max[year] = current_max # 转换成DataFrame yearly_max_df = pd.DataFrame(yearly_max.items(), columns=['Year', 'Max Temperature (°C)'])
总结
优先用groupby的方法,不仅代码简洁,而且Pandas的分组操作是经过优化的,处理大数据时比手动循环快很多。
内容的提问来源于stack exchange,提问作者Mercredi
相关产品推荐
相关产品推荐

