如何基于4月-次年3月财年规则创建保单登记量累计计数器
实现方案
你可以用pandas按以下逻辑实现:
- 先将日期列转换为datetime类型,方便后续时间计算
- 按日期分组统计每日的保单数量
- 给每条数据标记所属的财年分组:月份大于等于4月的归到当前年对应的财年组,1-3月归到上一年对应的财年组,确保同一个财年的数据被分到同一组
- 按财年分组后组内计算累计值,就能实现跨财年自动清零重新累计的效果
完整代码示例
import pandas as pd # 构造示例数据 data = { "Policy_No": [1, 2, 3, 4, 5, 6, 7], "Date": ["10/1/2020", "20/2/2020", "20/2/2020", "23/3/2020", "18/4/2020", "30/4/2020", "30/4/2020"] } df = pd.DataFrame(data) # 转换日期格式,注意原数据是日/月/年的格式,需要指定format df["Date"] = pd.to_datetime(df["Date"], format="%d/%m/%Y") # 按日期统计每日保单数量 daily_count = df.groupby("Date", as_index=False).agg(day_count=("Policy_No", "count")) # 标记财年分组:4月及之后属于当前年财年组,1-3月属于上一年财年组 daily_count["fiscal_group"] = daily_count["Date"].apply(lambda x: x.year if x.month >= 4 else x.year - 1) # 按财年分组计算累计保单数 daily_count["Cum count of policies"] = daily_count.groupby("fiscal_group")["day_count"].cumsum() # 转换日期为字符串格式输出,可选 daily_count["Date"] = daily_count["Date"].dt.strftime("%d/%m/%Y") # 输出结果 result = daily_count[["Date", "Cum count of policies"]] print(result)
输出结果
Date Cum count of policies 0 10/01/2020 1 1 20/02/2020 3 2 23/03/2020 4 3 18/04/2020 1 4 30/04/2020 3
注:你给出的预期输出中4月的日期年份写为2021属于笔误,上述结果与你预期的数值逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Abishay Mathew
相关产品推荐
相关产品推荐

