Pandas按年度累加T_mean列获取达阈值200对应日期的实现方法问询
实现方案
你可以直接用pandas的分组累积和功能实现需求,不需要手动为每一年重复编写代码,具体实现步骤如下:
1. 核心实现(无需单独生成每年累加列)
该方案仅需新增1列分组累积和,就可以快速得到所有年份的目标日期:
import pandas as pd import numpy as np # 测试数据构造代码 Date = [19370101, 19370102, 19370103, 19370104, 19370105, 19370106] Year = [1937, 1937, 1937, 1937, 1937, 1937] T_mean = [5.8, 5.6, 9.2, 8.0, 4.3, 6.4] df = pd.DataFrame(Date, columns = ['Date']) df.insert(1, "Year", Year, allow_duplicates=False) df.insert(2, "T_mean", T_mean, allow_duplicates=False) # 按年份分组计算组内累积和,直接生成分年累加值列 df['annual_cum_tmean'] = df.groupby('Year')['T_mean'].cumsum() # 筛选每年首次达到或超过200的记录 limit = 200 annual_target_date = df[df['annual_cum_tmean'] >= limit].groupby('Year', as_index=False).first()
得到的annual_target_date就是所有年份对应的首次达标日期,和你期望的输出效果一致。
2. 可选方案(按需求生成每年单独累加列)
如果你确实需要为每一年单独生成对应的累加列,可以用循环批量生成,无需手动编写每个年份的逻辑:
for year in df['Year'].unique(): # 仅对当前年份的行计算累积和,其余年份位置填充空值 df[f'Sum_{year}'] = df.apply(lambda x: x['T_mean'] if x['Year'] == year else np.nan, axis=1).groupby('Year').cumsum()
生成列后你可以用你原来的逻辑查询对应年份的达标日期,代码和你之前的写法一致。
原代码问题说明
你之前的代码有两个核心错误:
- 条件判断
if i in dataset['Year'] == 1937语法错误,无法正确筛选对应年份的行 - 未筛选年份就直接调用
np.cumsum,计算的还是全时间段的全局累积和,不是分年结果
内容的提问来源于stack exchange,提问作者Nicole158
相关产品推荐
相关产品推荐

