如何从DataFrame的月度期间格式字段中提取月份与实际年份?
解析财年格式日期的解决方案
核心思路
从"June 2021-22"这类字符串中拆分出月份、财年起始/结束年份,再根据财年规则(示例中为4月至次年3月为一个财年)判断实际归属年份:
- 4-12月的日期,实际年份为财年起始年份
- 1-3月的日期,实际年份为财年结束年份
具体实现步骤
1. 准备示例数据
import pandas as pd # 模拟用户的DataFrame df = pd.DataFrame( {'period': ['June 2021-22', 'January 2021-22', 'March 2022-23', 'April 2022-23']} )
2. 拆分日期组件
用正则提取月份、财年起始年份,财年结束年份直接通过起始年份+1得到(比字符串拼接更可靠):
# 提取月份和财年起始年份 df[['month', 'fy_start']] = df['period'].str.extract(r'(\w+) (\d{4})-\d{2}') df['fy_start'] = df['fy_start'].astype(int) # 计算财年结束年份(如2021-22的结束年份是2022) df['fy_end'] = df['fy_start'] + 1
3. 映射月份并判断实际年份
先把月份名称转成数字,再根据财年规则赋值实际年份:
# 月份名称转数字的映射表 month_map = { 'January':1, 'February':2, 'March':3, 'April':4, 'May':5, 'June':6, 'July':7, 'August':8, 'September':9, 'October':10, 'November':11, 'December':12 } df['month_num'] = df['month'].map(month_map) # 根据财年规则计算实际年份 df['actual_year'] = df.apply( lambda row: row['fy_start'] if row['month_num'] >=4 else row['fy_end'], axis=1 )
4. 生成最终日期字符串
df['actual_date'] = df['month'] + ' ' + df['actual_year'].astype(str)
简化版实现(无需中间列)
如果不想保留拆分的中间列,可以用自定义函数一次性处理:
def parse_fy_date(period_str): month_part, fy_part = period_str.split() fy_start = int(fy_part.split('-')[0]) fy_end = fy_start + 1 month_num = month_map[month_part] actual_year = fy_start if month_num >=4 else fy_end return f"{month_part} {actual_year}" df['actual_date'] = df['period'].apply(parse_fy_date)
结果示例
处理后actual_date列的输出为:
- June 2021
- January 2022
- March 2023
- April 2022
注意:如果你的财年分界不是3月,只需修改
month_num >=4这个条件即可(比如财年是7月到次年6月,就改成month_num >=7)
内容的提问来源于stack exchange,提问作者user8112228
相关产品推荐
相关产品推荐

