从Pandas DataFrame中按复杂条件筛选极端高温值
Pandas实现极端高温标记的简洁方案
需求规则
为包含日期和日最高温的Pandas DataFrame添加extreme_highs列,标记规则如下:
- 未标记的条目值设为0
- 仅高于40℃的温度具备标记资格
- 从最早日期开始遍历:
- 找到首个符合资格的日期,以该日期为起点取包含自身在内的4天窗口
- 标记窗口内温度最高的日期(若有多个最高值,选最早出现的)
- 标记完成后,跳过后续6天,每7天周期仅标记1次
示例数据集
import pandas as pd data_dict = { 'dates': ['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04', '2023-07-05', '2023-07-06', '2023-07-07', '2023-07-08', '2023-07-09', '2023-07-10', '2023-07-11', '2023-07-12', '2023-07-13', '2023-07-14', '2023-07-15', '2023-07-16', '2023-07-17', '2023-07-18', '2023-07-19', '2023-07-20', '2023-07-21', '2023-07-22', '2023-07-23', '2023-07-24', '2023-07-25', '2023-07-26', '2023-07-27', '2023-07-28', '2023-07-29', '2023-07-30', '2023-07-31', '2023-08-01', '2023-08-02'], 'daily_high_temp': [39.1, 39.8, 40, 40.3, 40.4, 40.2, 40.4, 40.6, 41, 41.1, 40.9, 41.2, 40.9, 39.9, 41.2, 42, 42.3, 41.9, 40.7, 39.8, 41.1, 41.3, 40.9, 40.7, 40, 39.8, 41.2, 40.9, 39.6, 40.9, 41.4, 41.2, 41.4] } df = pd.DataFrame(data=data_dict) # 转换日期列为datetime类型,确保时间顺序正确 df['dates'] = pd.to_datetime(df['dates'])
实现代码
# 初始化标记列 df['extreme_highs'] = 0 current_idx = 0 total_rows = len(df) while current_idx < total_rows: # 筛选当前位置及之后的合格温度(>40℃) eligible_mask = (df['daily_high_temp'] > 40) & (df.index >= current_idx) eligible_indices = df[eligible_mask].index if eligible_indices.empty: break # 无合格数据,终止循环 # 取第一个合格索引作为窗口起点 window_start = eligible_indices[0] # 确定窗口终点(最多包含4天) window_end = min(window_start + 3, total_rows - 1) # 截取窗口数据 window_data = df.loc[window_start:window_end] # 找到窗口内最高温的最早出现位置 max_temp_value = window_data['daily_high_temp'].max() mark_index = window_data[window_data['daily_high_temp'] == max_temp_value].index[0] # 标记该位置的温度值 df.loc[mark_index, 'extreme_highs'] = df.loc[mark_index, 'daily_high_temp'] # 跳过后续6天,下一轮从标记索引+7开始 current_idx = mark_index + 7
代码说明
- 日期预处理:将
dates转为datetime类型,避免字符串排序导致的逻辑错误。 - 循环遍历逻辑:
- 每次从当前索引开始,筛选出所有符合温度要求的条目,取第一个作为窗口起点。
- 生成包含起点的4天窗口,找到窗口内最高温的最早出现位置并标记。
- 标记完成后直接跳转到
标记索引+7,严格遵守"每7天仅标记1次"的规则。
- 边界处理:窗口终点不超过DataFrame最后一行,无合格数据时自动终止循环。
内容的提问来源于stack exchange,提问作者MC Hammerabi
相关产品推荐
相关产品推荐

