如何在Python中为符合特定条件的逐小时降雨事件编号?
解决方案
要实现符合要求的E1列,核心是先识别完整的降雨事件,再筛选出前后均为0的有效事件,最后给有效事件分配编号。步骤如下:
1. 预处理NaN值
将value中的NaN替换为特殊值(比如-1),因为NaN既不属于0也不属于降雨,会中断事件连续性。
2. 识别降雨事件
标记降雨时段,然后给每个连续的降雨事件分配唯一组号。
3. 筛选有效事件
对每个事件,检查其开始前的前一个值是0且结束后的后一个值是0,只有符合这两个条件的事件才被计数。
完整代码
import pandas as pd # 模拟输入数据 data = { 'hour': range(24), 'value': [0.0, 0.2, 0.2, 0.2, 0.0, 0.2, 0.2, 0.0, None, 0.2, 0.0, 0.0, 0.2, 0.2, 0.0, None, 0.2, 0.0, 0.2, 0.0, 0.2, 0.2, None, 0.0] } df = pd.DataFrame(data) # 步骤1:处理NaN,用-1标记非0非降雨的情况 df['value_clean'] = df['value'].fillna(-1) # 步骤2:标记降雨时段和事件起始 df['is_rain'] = df['value_clean'] > 0 df['event_start'] = df['is_rain'] & ~df['is_rain'].shift(1, fill_value=False) df['event_id'] = df['event_start'].cumsum() # 步骤3:获取每个事件的前后值,筛选有效事件 event_details = df.groupby('event_id').agg( first_idx=('hour', 'first'), last_idx=('hour', 'last'), prev_val=('value', lambda x: df.loc[x.index[0]-1, 'value'] if x.index[0] > 0 else None), next_val=('value', lambda x: df.loc[x.index[-1]+1, 'value'] if x.index[-1] < len(df)-1 else None) ).reset_index() # 筛选符合条件的事件:前后都是0,且是有效降雨事件(event_id>0) valid_event_ids = event_details[ (event_details['event_id'] > 0) & (event_details['prev_val'] == 0.0) & (event_details['next_val'] == 0.0) ]['event_id'].tolist() # 创建E1列:有效事件保留编号,其余为0 df['E1'] = df['event_id'].map(lambda x: x if x in valid_event_ids else 0) # 清理中间列并输出结果 df = df.drop(['value_clean', 'is_rain', 'event_start', 'event_id'], axis=1) print(df)
输出结果
hour value E1 0 0 0.0 0 1 1 0.2 1 2 2 0.2 1 3 3 0.2 1 4 4 0.0 0 5 5 0.2 2 6 6 0.2 2 7 7 0.0 0 8 8 NaN 0 9 9 0.2 0 10 10 0.0 0 11 11 0.0 0 12 12 0.2 3 13 13 0.2 3 14 14 0.0 0 15 15 NaN 0 16 16 0.2 0 17 17 0.0 0 18 18 0.2 4 19 19 0.0 0 20 20 0.2 0 21 21 0.2 0 22 22 NaN 0 23 23 0.0 0
内容的提问来源于stack exchange,提问作者Lucia
相关产品推荐
相关产品推荐

