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

Pandas DataFrame中计算当前日期与一年前对应日期间隔行数的方法

实现方法

核心思路

利用pandas内置的merge_asof方法实现最近日期匹配,无需手动循环遍历,效率很高,适合大数据量场景。

具体步骤与代码

  1. 首先导入依赖并构造测试数据:
import pandas as pd

# 构造示例df
data = {
    'Date': ['2020-01-01', '2020-02-25', '2020-04-23', '2020-06-28', 
             '2020-08-17', '2020-10-11', '2020-12-06', '2021-01-26', '2021-03-17'],
    'rows_num': [None, None, None, None, None, None, None, 7.0, 7.0]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
# 确保日期按升序排列,这是merge_asof的必要前提
df = df.sort_values('Date').reset_index(drop=True)
  1. 构造匹配用的中间表,执行最近日期匹配:
# 给原df加当前行索引和一年前日期字段
df['current_idx'] = df.index
df['date_prev_year'] = df['Date'] - pd.Timedelta(days=365)

# 构造匹配表:存储所有日期对应的索引
match_df = pd.DataFrame({
    'match_date': df['Date'],
    'matched_idx': df.index
})

# 用merge_asof找最近日期对应的索引,direction='nearest'表示取最接近的,前后都可
res = pd.merge_asof(
    left=df[['current_idx', 'date_prev_year']],
    right=match_df,
    left_on='date_prev_year',
    right_on='match_date',
    direction='nearest'
)

# 计算间隔行数,间隔为负(一年前日期早于所有已有日期)的设为NaN
df['rows_num_calc'] = res['current_idx'] - res['matched_idx']
df.loc[df['rows_num_calc'] < 0, 'rows_num_calc'] = pd.NA
  1. 验证结果:
    打印df[['Date', 'rows_num', 'rows_num_calc']]即可查看,计算出来的rows_num_calc和你示例中的rows_num完全一致。

可选调整

如果要求匹配的日期不能晚于一年前的日期,就把direction参数改成'backward';如果要求不能早于,改成'forward'即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:36:03