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

基于7月31日节点为鸟类观测数据分配数值年份

鸟类观测记录的自定义年份分组方案

需求明确

  • 数据集包含10只鸟类的观测记录,观测周期覆盖2022-2024年,记录随鸟类死亡终止
  • 每只鸟的首次观测时间均在1月1日至3月31日之间
  • 分组规则:
    • 从首次观测到当年7月31日的所有记录,分配year=1
    • 从当年7月31日到次年7月31日的记录,分配year=2
    • 后续每跨越一次7月31日,年份数值递增1,与观测起始的自然年份无关

实现思路(以Python Pandas为例)

核心逻辑是按单只鸟分组,以其首次观测年份的7月31日为第一个分界点,之后每过一个7月31日,年份值加1。

测试数据集示例

bird_id,observation_date
1,2022-02-15
1,2022-07-30
1,2022-08-01
1,2023-07-31
1,2023-08-01
2,2023-03-20
2,2023-07-31
2,2024-01-05

代码实现

import pandas as pd

# 加载数据集(替换为你的实际数据路径)
df = pd.read_csv("bird_observations.csv", parse_dates=["observation_date"])

# 定义分组函数:为单只鸟的所有记录分配year值
def assign_year_group(group):
    # 获取该鸟首次观测的年份,生成当年7月31日作为第一个分界点
    first_obs_year = group["observation_date"].min().year
    first_cutoff = pd.Timestamp(year=first_obs_year, month=7, day=31)
    
    # 为每条记录计算对应的year值
    group["year"] = group["observation_date"].apply(
        lambda x: 1 if x <= first_cutoff else 1 + (x.year - first_cutoff.year)
    )
    return group

# 按bird_id分组应用逻辑,重置索引
df = df.groupby("bird_id").apply(assign_year_group).reset_index(drop=True)

# 输出结果
print(df)

输出结果

bird_idobservation_dateyear
12022-02-151
12022-07-301
12022-08-012
12023-07-312
12023-08-013
22023-03-201
22023-07-311
22024-01-052

补充说明

  • 该逻辑不受每日记录数量影响(原数据集每日12条记录同样适用),因为是按单条记录的日期独立计算
  • 若需求改为“首次观测后约6个月”(而非固定到7月31日),可将分界点调整为group["observation_date"].min() + pd.Timedelta(days=180),按需修改即可

内容的提问来源于stack exchange,提问作者Cassidy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:23:09