如何在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
相关产品推荐
相关产品推荐

