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

如何基于另一个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是无效日期被排除:

namepaid_amountdate_paid
0aaa102017-10-10 00:00:00
1aba102017-01-10 00:00:00
2aac102017-10-10 00:00:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:58:01