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

如何在Pandas中获取大于等于指定日期的首个有效日期

解决方案

问题根因

你当前使用的最近日期匹配逻辑允许返回早于当月1日的日期,2020-12-31距离2021-01-01仅1天,比2021-01-04的3天间隔更近,因此出现不符合预期的结果。你的实际需求是取大于等于当月1日的最小存在日期,仅需要匹配当月及之后的日期即可。

方案1:最小改动现有代码

直接修改nearest函数的逻辑,过滤掉早于月首日的记录后再取最小值:

df['month'] = df.index.to_numpy().astype('datetime64[M]')
def first_day_of_month(items, pivot):
    # 仅保留大于等于当月1日的有效日期,取最小的就是当月首个存在的日期
    valid_dates = [x for x in items if x >= pivot]
    return min(valid_dates)

for n in range(len(df)):    
    d = first_day_of_month(df.index, df['month'][n])
    print(d)

方案2:更高效的Pandas原生实现(无循环,适合大数据量)

利用Pandas分组能力直接取每个月的第一条记录索引,性能远高于循环遍历:

# 先确保索引为datetime类型(样本日期是日/月/年格式,指定dayfirst=True解析)
df.index = pd.to_datetime(df.index, dayfirst=True)

# 方式1:直接获取所有月份的首个存在日期列表
month_first_dates = df.groupby(df.index.to_period('M')).head(1).index

# 方式2:给每行新增字段,关联对应月份的首个日期
df['month_first_date'] = df.groupby(df.index.to_period('M')).transform(lambda x: x.index[0])

输出验证

使用你提供的样本数据运行后,2021年1月对应的首个日期将正确返回2021-01-04,2020年12月返回2020-12-28,2021年2月返回2021-02-01,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:42:02