You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于统一生日规则计算赛马年龄并填充DataFrame Age列的技术需求

问题

赛马年龄计算规则统一为:所有赛马以8月1日作为官方生日,与实际出生日期无关。例如,一匹7月31日出生的赛马,哪怕仅出生1天,也会被归类为1岁。

现有一个pandas DataFrame,包含以下三列:

  • FoalDate:赛马实际出生日期
  • MeetingDate:赛事举办日期
  • Age:年龄列(当前值全为0,需替换为计算后的正确年龄)

示例数据:

FoalDateMeetingDateAge
20/11/201430/04/20172

说明:该赛马年龄为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:05:15