如何用Pandas计算连续土壤湿度测量间的累计降雨量与湿度差值?
解决Pandas中连续有效土壤湿度间累计降雨量与湿度差计算问题
问题背景
你是Pandas初学者,数据集包含Date、SM(土壤湿度)、Rain(降雨量)字段,已完成时间索引处理:
df= pd.read_excel('Dataset.xlsx') df['Datetime']=pd.to_datetime(df['Date']) df=df.set_index('Datetime')
其中SM字段用"-"表示缺失值,需计算两个连续有效SM间的累计降雨量(Rsum)和土壤湿度差值(deltaSM),输出格式参考给定示例。
解决方案步骤
1. 统一缺失值格式
先将SM列中的"-"转换为Pandas可识别的NaN:
df['SM'] = pd.to_numeric(df['SM'], errors='coerce')
2. 构建有效SM分组
通过标记有效行并生成分组ID,将连续缺失值与前后有效SM划分为同一组:
# 标记SM非缺失的有效行 df['is_valid'] = df['SM'].notna() # 生成分组编号:每遇到有效行则分组ID递增 df['group'] = df['is_valid'].cumsum()
3. 计算累计降雨量Rsum
对每个分组内的降雨量进行累计求和,仅将结果赋值给该分组的下一个有效SM行:
# 计算分组内从当前行下一行开始的累计降雨量,向前填充确保有效行能获取到总和 df['Rsum'] = df.groupby('group')['Rain'].transform(lambda x: x.shift(-1).cumsum().ffill()) # 第一个有效SM的Rsum设为0 df.loc[df['group'] == df['group'].min(), 'Rsum'] = 0 # 缺失SM的行替换为"-" df['Rsum'] = df['Rsum'].where(df['is_valid'], '-')
4. 计算土壤湿度差值deltaSM
用当前有效SM减去上一个有效SM的值,得到湿度差:
# 计算当前SM与上一个有效SM的差值 df['deltaSM'] = df['SM'] - df['SM'].ffill() # 第一个有效SM的deltaSM设为"-" df.loc[df['group'] == df['group'].min(), 'deltaSM'] = '-' # 缺失SM的行替换为"-" df['deltaSM'] = df['deltaSM'].where(df['is_valid'], '-')
5. 格式化输出结果
调整数据格式以匹配期望输出:
# 格式化有效行的deltaSM为两位小数 df['deltaSM'] = df['deltaSM'].apply(lambda x: f"{x:.2f}" if isinstance(x, float) else x) # 格式化有效行的Rsum为一位小数 df['Rsum'] = df['Rsum'].apply(lambda x: f"{x:.1f}" if isinstance(x, float) else x) # 重置索引并保留指定列 df = df.reset_index()[['Date', 'SM', 'Rain', 'deltaSM', 'Rsum']] # 将SM列的NaN还原为"-" df['SM'] = df['SM'].apply(lambda x: f"{x:.2f}" if isinstance(x, float) else "-")
执行上述代码后,即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Sofia Ortenzi
相关产品推荐
相关产品推荐

