基于7月31日节点为鸟类观测数据分配数值年份
鸟类观测记录的自定义年份分组方案
需求明确
- 数据集包含10只鸟类的观测记录,观测周期覆盖2022-2024年,记录随鸟类死亡终止
- 每只鸟的首次观测时间均在1月1日至3月31日之间
- 分组规则:
- 从首次观测到当年7月31日的所有记录,分配
year=1 - 从当年7月31日到次年7月31日的记录,分配
year=2 - 后续每跨越一次7月31日,年份数值递增1,与观测起始的自然年份无关
- 从首次观测到当年7月31日的所有记录,分配
实现思路(以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_id | observation_date | year |
|---|---|---|
| 1 | 2022-02-15 | 1 |
| 1 | 2022-07-30 | 1 |
| 1 | 2022-08-01 | 2 |
| 1 | 2023-07-31 | 2 |
| 1 | 2023-08-01 | 3 |
| 2 | 2023-03-20 | 1 |
| 2 | 2023-07-31 | 1 |
| 2 | 2024-01-05 | 2 |
补充说明
- 该逻辑不受每日记录数量影响(原数据集每日12条记录同样适用),因为是按单条记录的日期独立计算
- 若需求改为“首次观测后约6个月”(而非固定到7月31日),可将分界点调整为
group["observation_date"].min() + pd.Timedelta(days=180),按需修改即可
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

