如何基于另一个DataFrame的日期范围筛选目标DataFrame数据
解答:筛选DataFrame中日期落在指定范围内的数据
看起来你尝试用另一个DataFrame的日期范围来筛选第一个DataFrame的数据,但当前的代码存在语法和逻辑问题。我来帮你修正并给出可行的方案。
首先,先明确你的原始数据结构(我把它整理成可运行的代码形式):
import pandas as pd # 构造你的df1 df1 = pd.DataFrame({ 'name': ['aaa', 'aba', 'aac', 'daa'], 'paid_amount': [10, 10, 10, 10], 'date_paid': ['2017-10-10', '2017-01-10', '2017-10-10', '2017-16-10'] }) # 构造你的df2 df2 = pd.DataFrame({ 'start_date': ['2017-01-01'], 'end_date': ['2018-01-01'] })
你的原始代码存在的问题
$date_paid是错误的语法,在pandas中引用DataFrame的列应该用df1['date_paid']isin()方法用于检查元素是否存在于一个集合中,不能用来判断数值/日期范围df2.start_date && df2.end_date不符合pandas的语法:布尔运算应该用&,而且这里你需要的是提取df2中的单个日期值(因为df2只有一行),而不是直接操作整个Series
正确的实现步骤
1. 先把日期列转换为datetime类型
原始数据中的日期是字符串,必须转换成pandas的datetime类型才能进行范围比较,同时处理无效日期(比如你df1里的2017-16-10,月份16是无效的,转换时会变成NaT):
# 转换日期列,errors='coerce'将无效日期转为NaT(Not a Time) df1['date_paid'] = pd.to_datetime(df1['date_paid'], errors='coerce') df2['start_date'] = pd.to_datetime(df2['start_date']) df2['end_date'] = pd.to_datetime(df2['end_date'])
2. 提取df2中的日期范围
因为df2只有一行数据,我们可以直接提取标量值:
start_date = df2['start_date'].iloc[0] end_date = df2['end_date'].iloc[0]
3. 筛选符合条件的数据
有两种常用方法:
方法一:使用between()函数
# 筛选date_paid在[start_date, end_date]之间,且排除无效日期(NaT) filtered_df = df1[(df1['date_paid'].between(start_date, end_date)) & (df1['date_paid'].notna())]
方法二:直接用布尔索引比较
filtered_df = df1[(df1['date_paid'] >= start_date) & (df1['date_paid'] <= end_date) & (df1['date_paid'].notna())]
最终结果
运行上述代码后,filtered_df会包含df1中前三条有效日期的数据,第四条因为2017-16-10是无效日期被排除:
| name | paid_amount | date_paid | |
|---|---|---|---|
| 0 | aaa | 10 | 2017-10-10 00:00:00 |
| 1 | aba | 10 | 2017-01-10 00:00:00 |
| 2 | aac | 10 | 2017-10-10 00:00:00 |
内容的提问来源于stack exchange,提问作者kk420
相关产品推荐
相关产品推荐

