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

计算数据框中事件日期开区间内的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:37:54