英超足球赛事DataFrame如何根据比赛日期设置赛季字段
英超赛事DataFrame新增赛季列实现方案
原有代码问题排查
- 自定义
get_season函数没有设置return返回值,调用apply后所有返回结果均为None,自然不符合预期 - 仅判断了2021年8月之后的日期规则,没有覆盖其他年份的比赛日期,无法适配多赛季数据集
pd.to_datetime("01/08/2021")存在格式歧义,默认解析规则下会被识别为2021年1月8日,和你预期的2021年8月1日不符
正确实现方案
前置操作:统一日期列格式
首先将日期列转为标准datetime类型,避免后续判断出现格式错误:
import pandas as pd # 可根据你实际的日期格式调整format参数,比如日/月/年格式对应'%d/%m/%Y' prem_data_new['Date'] = pd.to_datetime(prem_data_new['Date'], format='%Y-%m-%d')
方案1:修正自定义函数实现(逻辑直观易理解)
根据英超赛季规则:每年8月到次年5月为一个完整赛季,赛季取值为赛季开始的年份,修改函数逻辑如下:
def get_season(row): match_date = row['Date'] if match_date.month >= 8: return str(match_date.year) else: return str(match_date.year - 1) prem_data_new['Season'] = prem_data_new.apply(get_season, axis=1)
方案2:向量化操作实现(数据量大时性能更优)
不需要遍历每行,直接用pandas内置的日期属性批量处理:
prem_data_new['Season'] = prem_data_new['Date'].dt.year.where( prem_data_new['Date'].dt.month >= 8, prem_data_new['Date'].dt.year - 1 ).astype(str)
规则验证示例
按照上述逻辑,日期对应赛季结果如下,符合需求:
- 2021-08-13 → 2021
- 2022-05-22 → 2021(属于2021/22赛季,取开始年份)
- 2022-08-06 → 2022
内容的提问来源于stack exchange,提问作者neilHouselander
相关产品推荐
相关产品推荐

