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

Python中使用F字符串进行日期时间比较:DataFrame按日期过滤返回空结果的解决方法

解决pandas循环过滤日期列返回空DataFrame的问题

你遇到的问题根源在于使用F字符串拼接日期时没有正确处理格式,导致query方法无法识别日期值。当你写f'Date == {date.date()}'时,生成的查询字符串是类似Date == 2021-10-11的格式——pandas会把2021-10-11解析成减法运算(2021减10减11),而不是日期值,自然匹配不到任何数据。

下面给你几种可行的解决方案,按推荐程度排序:

方法1:使用groupby直接按日期分组(最简洁高效)

如果你的需求是对每个唯一日期对应的切片做处理,groupby是最优雅的方式,无需手动去重循环:

import pandas as pd

Y = pd.DataFrame([("2021-10-11","john"),("2021-10-12","wick")],columns = ['Date','Name'])
Y['Date'] = pd.to_datetime(Y['Date'])

# 按Date列分组,直接遍历每个分组
for date, group_df in Y.groupby('Date'):
    print(f"处理日期:{date.date()}")
    print(group_df)
    # 这里可以添加你的后续处理逻辑,比如对group_df做计算、保存等

方法2:修正query的写法(保留query使用习惯)

有两种方式可以让query正确识别日期:

方式A:用@引用外部变量

直接传入datetime类型的date变量,用@告诉query这是外部变量:

for date in Y['Date'].unique():
    filtered_df = Y.query('Date == @date')
    print(filtered_df)

方式B:给日期字符串加引号

把date.date()转换成带引号的字符串,让query识别为日期字面量:

for date in Y['Date'].unique():
    filtered_df = Y.query(f'Date == "{date.date()}"')
    print(filtered_df)

方法3:使用布尔索引(最直观易读)

放弃query,直接用布尔索引过滤,这种写法不容易出错,新手友好:

for date in Y['Date'].unique():
    filtered_df = Y[Y['Date'] == date]
    print(filtered_df)

另外提醒一下:尽量用Y['Date'].unique()代替set(Y['Date']),因为unique()会保留原DataFrame中的日期顺序,而set是无序的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:24:10