python按照财年分组案例

有如下数据:需要按照如下要求进行分组。

需求是对Site进行分组

条件当值是Act得时候,分组名字就是

条件当值是Rebase*得时候,分组名字就是FY?+1/?+1

条件当值是FIRM 得时候,分组名字就是

每年得7月到次年得6月为一个财年,分组成列“FY2324”

数据样例:👇
在这里插入图片描述
python解决办法​:
第一种解决办法​:


import pandas as pd
import re
from datetime import datetime

# 模拟您的数据,实际情况中请使用 pandas 读取您的数据文件
data = [
    "FY21/22 Act",
    "FY22/23 Act",
    "Rebase FY22/23 Act",
    "FY23/24 FIRM",
    "2023/7/1",
    "2023/8/1",
    "2023/9/1",
    "2023/10/1",
    "2023/11/1",
    "2023/12/1",
    "2024/1/1",
    "2024/2/1",
    "2024/3/1",
    "2024/4/1",
    "2024/5/1",
    "2024/6/1",
    "FY23/24 Act",
    "Rebase FY23/24 Act",
    "FY24/25 FIRM",
    "2024/7/1",
    "2024/8/1",
    "2024/9/1",
    "2024/10/1",
    "2024/11/1",
    "2024/12/1",
    "2025/1/1",
    "2025/2/1",
    "2025/3/1",
    "2025/4/1",
    "2025/5/1",
    "2025/6/1",
    "FY24/25 Act",
    "Rebase FY24/25 Act",
    "FY25/26 FIRM",
    "2025/7/1",
    "2025/8/1",
    "2025/9/1",
    "2025/10/1",
    "2025/11/1",
    "2025/12/1",
    "2026/1/1",
    "2026/2/1",
    "2026/3/1",
    "2026/4/1",
    "2026/5/1",
    "2026/6/1",
    "FY25/26 Act",
]

# 使用模拟数据创建一个名为 df 的 DataFrame,列名为'Site'
df = pd.DataFrame(data, columns=['Site'])

# 定义一个函数,用于根据输入值确定分组名称
def get_group_name(value):
    # 处理 "Rebase" 开头的字符串
    rebase_match = re.match(r"Rebase FY(\d+)/(\d+).*", value)
    # 如果输入值匹配以"Rebase FY"开头的模式
    if rebase_match:
        start_year, end_year = int(rebase_match.group(1)), int(rebase_match.group(2))
        # 返回下一个财年的分组名称格式
        return f"FY{start_year + 1:02d}/{end_year + 1:02d}"
    
    # 处理 "Act" 或 "FIRM" 结尾的字符串
    act_firm_match = re.match(r"^FY(\d+)/(\d+).*", value)
    # 如果输入值匹配以"FY"开头,并且以"Act"或"FIRM"结尾的模式
    if act_firm_match:
        start_year, end_year = int(act_firm_match.group(1)), int(act_firm_match.group(2))
        # 返回当前财年的分组名称格式
        return f"FY{start_year:02d}/{end_year:02d}"
    
    # 处理日期格式的数据
    try:
        date = datetime.strptime(value, "%Y/%m/%d")
        fiscal_year_start = datetime(date.year, 7, 1)
        # 如果日期在财年开始之后
        if date >= fiscal_year_start:
            return f"FY{date.year - 2000}/{date.year - 1999}"
        else:
            return f"FY{date.year - 1999}/{date.year - 2000}"
    except ValueError:
        pass
    
    return None

# 对 DataFrame 的'Site'列应用 get_group_name 函数,结果存储在新的列'分组'中
df['分组'] = df['Site'].apply(get_group_name)

# 打印结果
print("Site\t分组")
for index, row in df.iterrows():
    # 逐行打印数据的'Site'列和'分组'列的值
    print(f"{row['Site']}\t{row['分组']}")

​第二种写法:

# 导入 pandas 库,用于数据处理
import pandas as pd
# 导入正则表达式库,用于文本匹配
import re
# 导入 datetime 库,用于日期时间处理
from datetime import datetime

# 定义一个数据列表,包含不同的年份和财务年份标签
data = [
    "FY21/22 Act",
    "FY22/23 Act",
    "Rebase FY22/23 Act",
    "FY23/24 FIRM",
    "2023/7/1",
    "2023/8/1",
    "2023/9/1",
    "2023/10/1",
    "2023/11/1",
    "2023/12/1",
    "2024/1/1",
    "2024/2/1",
    "2024/3/1",
    "2024/4/1",
    "2024/5/1",
    "2024/6/1",
    "FY23/24 Act",
    "Rebase FY23/24 Act",
    "FY24/25 FIRM",
    "2024/7/1",
    "2024/8/1",
    "2024/9/1",
    "2024/10/1",
    "2024/11/1",
    "2024/12/1",
    "2025/1/1",
    "2025/2/1",
    "2025/3/1",
    "2025/4/1",
    "2025/5/1",
    "2025/6/1",
    "FY24/25 Act",
    "Rebase FY24/25 Act",
    "FY25/26 FIRM",
    "2025/7/1",
    "2025/8/1",
    "2025/9/1",
    "2025/10/1",
    "2025/11/1",
    "2025/12/1",
    "2026/1/1",
    "2026/2/1",
    "2026/3/1",
    "2026/4/1",
    "2026/5/1",
    "2026/6/1",
    "FY25/26 Act",
]

# 定义一个 lambda 函数,用于根据给定的值生成对应的财务年份标签
get_group_name = lambda value: (
    # 如果值匹配 "Rebase FYxx/xx" 格式,则计算下一个财务年份并返回
    f"FY{int(re.match(r"Rebase FY(\d+)/(\d+).*", value).group(1)) + 1:02d}/{int(re.match(r"Rebase FY(\d+)/(\d+).*", value).group(2)) + 1:02d}" if re.match(r"Rebase FY(\d+)/(\d+).*", value)
    # 如果值匹配 "FYxx/xx" 格式,则直接返回对应的财务年份
    else f"FY{int(re.match(r"^FY(\d+)/(\d+).*", value).group(1)):02d}/{int(re.match(r"^FY(\d+)/(\d+).*", value).group(2)):02d}" if re.match(r"^FY(\d+)/(\d+).*", value)
    # 如果值是一个日期,并且该日期在7月1日或之后,则计算当前财务年份
    else f"FY{datetime.strptime(value, '%Y/%m/%d').year - 2000}/{datetime.strptime(value, '%Y/%m/%d').year - 1999}" if datetime.strptime(value, '%Y/%m/%d') >= datetime(datetime.strptime(value, '%Y/%m/%d').year, 7, 1) 
    # 否则,计算上一财务年份
    else f"FY{datetime.strptime(value, '%Y/%m/%d').year - 1999}/{datetime.strptime(value, '%Y/%m/%d').year - 2000}"
)

# 创建一个 DataFrame,并将数据列表作为一列 'Site' 传入
df = pd.DataFrame(data, columns=['Site'])
# 应用 lambda 函数,生成 '分组' 列
df['分组'] = df['Site'].apply(get_group_name)

# 打印结果,格式化输出 'Site' 和 '分组'
print("Site\t分组")
for index, row in df.iterrows():
    print(f"{row['Site']}\t{row['分组']}")

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值