基于统一生日规则计算赛马年龄并填充DataFrame Age列的技术需求
问题
赛马年龄计算规则统一为:所有赛马以8月1日作为官方生日,与实际出生日期无关。例如,一匹7月31日出生的赛马,哪怕仅出生1天,也会被归类为1岁。
现有一个pandas DataFrame,包含以下三列:
FoalDate:赛马实际出生日期MeetingDate:赛事举办日期Age:年龄列(当前值全为0,需替换为计算后的正确年龄)
示例数据:
| FoalDate | MeetingDate | Age |
|---|---|---|
| 20/11/2014 | 30/04/2017 | 2 |
说明:该赛马年龄为2岁,因为从其出生日期到赛事日期之间,仅经历过2015年和2016年的两次8月1日。
解决方案
1. 转换日期格式为datetime类型
首先需要将FoalDate和MeetingDate转换为pandas可处理的datetime格式,确保后续计算准确:
import pandas as pd # 假设你的DataFrame名为df df['FoalDate'] = pd.to_datetime(df['FoalDate'], dayfirst=True) df['MeetingDate'] = pd.to_datetime(df['MeetingDate'], dayfirst=True)
提示:如果你的日期格式是
月/日/年,将dayfirst参数改为False即可。
2. 计算正确年龄
根据规则,年龄的核心计算逻辑是:
- 若赛马实际出生日期在8月1日及之后(月份≥8),它的第一个官方生日是次年的8月1日;
- 若出生日期在8月1日之前(月份<8),第一个官方生日是当年的8月1日;
- 年龄等于从第一个官方生日到赛事日期为止,已经度过的官方生日数量。
对应代码实现:
# 计算第一个官方生日的年份 df['first_official_birth_year'] = df.apply( lambda row: row['FoalDate'].year + 1 if row['FoalDate'].month >= 8 else row['FoalDate'].year, axis=1 ) # 计算年龄 df['Age'] = df.apply( lambda row: # 赛事日期在当年8月1日之前:年龄=赛事年份 - 第一个官方生日年份 row['MeetingDate'].year - row['first_official_birth_year'] if row['MeetingDate'].month < 8 # 赛事日期在当年8月1日及之后:年龄=赛事年份 - 第一个官方生日年份 + 1 else row['MeetingDate'].year - row['first_official_birth_year'] + 1, axis=1 ) # 清理临时生成的列 df.drop('first_official_birth_year', axis=1, inplace=True)
验证示例
用示例数据测试:
FoalDate=2014-11-20:月份11≥8,第一个官方生日年份为2014+1=2015;MeetingDate=2017-04-30:月份4<8,年龄=2017-2015=2,与示例结果一致。
另一个测试场景:赛马出生于2015-07-31(月份7<8),第一个官方生日年份为2015;若赛事日期为2015-08-01,年龄=2015-2015+1=1,符合"出生1天算1岁"的规则。
内容的提问来源于stack exchange,提问作者onthepunt
相关产品推荐
相关产品推荐

