pandas实现非连续15分钟降水数据重采样及最大8小时降水站点查找
解决方案
问题根因
你原有的代码没有按station_id分组就直接执行重采样,会把所有站点同时段的降水量合并求和,自然无法得到站点独立的小时级统计结果。
完整处理步骤
步骤1:预处理时间字段
首先确保time_start为pandas datetime类型,避免后续时间运算出错:
import pandas as pd # 转换时间字段格式 df['time_start'] = pd.to_datetime(df['time_start'])
步骤2:按站点分组重采样得到小时级降水数据
分组后再执行重采样操作,保留站点维度,同时仅对降水量字段求和,避免其他数值字段被错误聚合:
# 按站点分组后逐站点做小时重采样 df_H = df.groupby('station_id', group_keys=False)\ .resample('H', on='time_start', closed='right')['precipition']\ .sum()\ .reset_index() # 输出每个站点按时间排序的小时降水量表(满足你的输出要求) df_H_sorted = df_H.sort_values(by=['station_id', 'time_start']).reset_index(drop=True)
如果需要导出该结果可直接调用df_H_sorted.to_csv('station_hour_precip.csv', index=False)
步骤3:筛选目标时段并按日统计总降水量
提取小时、日期维度,筛选指定的3个时段后聚合得到日度总降水量:
# 提取日期和小时字段 df_H_sorted['date'] = df_H_sorted['time_start'].dt.date df_H_sorted['hour'] = df_H_sorted['time_start'].dt.hour # 筛选7:00-10:00、13:00-14:00、16:00-17:00三个时段,小时维度匹配7、8、9、13、16 target_hours = [7,8,9,13,16] df_target = df_H_sorted[df_H_sorted['hour'].isin(target_hours)] # 按站点+日期统计目标时段总降水量 df_daily_total = df_target.groupby(['station_id', 'date'], as_index=False)['precipition'].sum() # 定位总降水量最大的站点和对应日期 max_row = df_daily_total.loc[df_daily_total['precipition'].idxmax()] print("最大降水量对应站点:", max_row['station_id']) print("对应日期:", max_row['date']) print("目标时段总降水量:", max_row['precipition'])
注意事项
- 重采样的
closed参数如果匹配你的统计规则可调整为closed='left',适配15分钟观测归属于结束时间所在小时的统计逻辑 - 缺测的小时重采样后会自动填充为0,符合降水量缺测按无降水处理的常规统计规则
内容的提问来源于stack exchange,提问作者GeoBeez
相关产品推荐
相关产品推荐

