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
相关产品推荐
相关产品推荐

