计算数据框中事件日期开区间内的12月31日数量
计算开区间(start, end)内包含的12月31日数量
这里的开区间指不包含开始日期和结束日期当天,我们需要统计所有满足 start < 31.12.YYYY < end 的年份YYYY的数量。以下是基于Python pandas的高效解决方案:
步骤1:确保日期列是datetime类型
如果你的start和end列还不是datetime格式,先进行转换(如果日期格式是日.月.年,记得加dayfirst=True):
import pandas as pd import numpy as np df['start'] = pd.to_datetime(df['start'], dayfirst=True) df['end'] = pd.to_datetime(df['end'], dayfirst=True)
步骤2:向量化计算符合条件的数量
通过判断边界年份的12月31日是否在区间内,再计算有效年份范围的差值:
# 标记开始日期是否在当年12月31日或之后(这样当年的12月31日就不在区间内) start_after_dec31 = df['start'] >= pd.to_datetime(df['start'].dt.year.astype(str) + '-12-31') # 标记结束日期是否在结束年份前一年的12月31日或之前(这样结束年份前一年的12月31日不在区间内) end_before_dec31 = df['end'] <= pd.to_datetime((df['end'].dt.year - 1).astype(str) + '-12-31') # 计算有效年份的起始和结束 min_target_year = df['start'].dt.year + start_after_dec31.astype(int) max_target_year = df['end'].dt.year - 1 - end_before_dec31.astype(int) # 计算数量,确保结果不会为负数 df['dec31_count'] = np.maximum(0, max_target_year - min_target_year + 1)
示例验证
几个典型场景的计算结果:
- 当
start=2020-01-01,end=2023-01-01→ 符合条件的12月31日是2020、2021 → 数量为2 - 当
start=2020-12-31,end=2023-12-31→ 符合条件的是2021、2022 → 数量为2 - 当
start=2021-01-01,end=2021-12-30→ 无符合条件的日期 → 数量为0 - 当
start=2020-12-30,end=2021-12-31→ 2020-12-31在区间内 → 数量为1
内容的提问来源于stack exchange,提问作者Larx
相关产品推荐
相关产品推荐

