如何在Pandas中筛选以FIX_DATE为终点的三月时间窗口数据?
解决方案
步骤1:转换日期列类型
首先需要将DATE和FIX_DATE列转换为Pandas的日期类型,方便后续月份差的计算:
import pandas as pd # 转换字符串日期为datetime类型 df['DATE'] = pd.to_datetime(df['DATE']) df['FIX_DATE'] = pd.to_datetime(df['FIX_DATE'])
步骤2:计算月份差并筛选目标记录
按ID分组后,计算每条记录的DATE与对应FIX_DATE的月份间隔,筛选出间隔在0到2之间的记录(包含FIX_DATE当月,以及往前推的两个月,正好组成三个月的周期):
方法一:用周期对象计算月份差
# 将日期转为月份周期,直接计算差值 df['month_diff'] = df['FIX_DATE'].dt.to_period('M') - df['DATE'].dt.to_period('M') # 筛选差值为0、1、2的记录,最后删除临时列 result = df[df['month_diff'].isin([0, 1, 2])].drop('month_diff', axis=1)
方法二:用年月数值计算差值
如果更习惯数值运算,可以将年月转换为数字(比如2023-05转为2023*12+5=24281),再计算差值:
# 生成年月的数值表示 df['date_num'] = df['DATE'].dt.year * 12 + df['DATE'].dt.month df['fix_date_num'] = df['FIX_DATE'].dt.year * 12 + df['FIX_DATE'].dt.month # 计算差值并筛选符合条件的记录 df['month_diff'] = df['fix_date_num'] - df['date_num'] result = df[(df['month_diff'] >= 0) & (df['month_diff'] <= 2)].drop(['date_num', 'fix_date_num', 'month_diff'], axis=1)
验证结果
运行代码后,result将得到预期的筛选结果:
ID DATE FIX_DATE 0 01 2023-03-01 2023-05-01 1 01 2023-04-01 2023-05-01 2 01 2023-05-01 2023-05-01 3 02 2023-02-01 2023-04-01 4 02 2023-03-01 2023-04-01 5 02 2023-04-01 2023-04-01
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

