如何在pandas中从日期提取财年、月份、自定义季度及相关上下文字段
完整可运行代码
import pandas as pd from datetime import datetime def create_date_table3(start, end): df = pd.DataFrame({"date": pd.date_range(start, end)}) # 基础月份字段 df["Month"] = df["date"].dt.month # 财年计算:7月到次年6月为一个财年 df["Year"] = df.apply(lambda x: x["date"].year + 1 if x["Month"] >=7 else x["date"].year, axis=1) # 自定义季度映射:完全匹配7-9月Q1、10-12月Q2、1-3月Q3、4-6月Q4规则 quarter_map = {1:3,2:3,3:3,4:4,5:4,6:4,7:1,8:1,9:1,10:2,11:2,12:2} df["Quarter"] = df["Month"].map(quarter_map) df["Year_Month"] = df["Year"].astype(str) + '_' + df["Month"].astype(str) # 计算当前参考基准值 now = datetime.now() current_month = now.month current_natural_year = now.year current_fiscal_year = current_natural_year + 1 if current_month >=7 else current_natural_year current_quarter = quarter_map[current_month] # 全局季度序号,用于跨财年计算季度差 current_q_global = current_fiscal_year * 4 + current_quarter # 年份上下文 df["YearContext"] = df["Year"].apply( lambda x: "Current Year" if x == current_fiscal_year else f"{current_fiscal_year - x} Yr Ago" ) # 月份上下文:修正原代码跨年计算错误 def calc_month_context(row): month_diff = (current_natural_year - row["date"].year) * 12 + (current_month - row["Month"]) if month_diff == 0: return "Current Month" return f"{month_diff} Mo Ago" if month_diff > 0 else f"{abs(month_diff)} Mo Later" df["MonthContext"] = df.apply(calc_month_context, axis=1) # 新增季度上下文 def calc_quarter_context(row): row_q_global = row["Year"] * 4 + row["Quarter"] q_diff = current_q_global - row_q_global if q_diff == 0: return "Current Quarter" return f"{q_diff} Qtr Ago" if q_diff > 0 else f"{abs(q_diff)} Qtr Later" df["QuarterContext"] = df.apply(calc_quarter_context, axis=1) return df
核心修改说明
- 自定义季度列:放弃容易出错的日期偏移取默认季度逻辑,直接用月份映射表匹配规则,完全符合需求的季度划分标准
- 财年逻辑:优化为直观的条件判断,和示例规则完全匹配:2021年1月属于2021财年,2021年8月属于2022财年
- 月份上下文:修正原代码直接减月份数值导致的跨年计算错误,通过年差换算为总月份差计算间隔,支持跨年度场景
- 季度上下文:通过全局季度序号(财年*4+季度)计算跨财年的季度间隔,完全符合上下文标注规则
内容的提问来源于stack exchange,提问作者alwayzconfused
相关产品推荐
相关产品推荐

