You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:13:11