为何按日期筛选DataFrame返回空结果?是否需转换carry_dt为日期类型?
问题分析与解决方案
嘿,这个问题我之前踩过坑!从你给出的DataFrame信息来看,carry_dt列的dtype是object,但直接用字符串'2018-05-17'匹配却得到空结果,大概率是以下两个原因之一:
- 原因1:
carry_dt表面显示是字符串,实际是datetime对象
有时候Pandas在显示DataFrame时,会把datetime类型自动格式化为字符串样式,但本质还是datetime对象。这时候用字符串去和datetime对象比较,自然匹配不上。 - 原因2:
carry_dt是带时间部分的字符串
比如实际存储的是'2018-05-17 00:00:00',但DataFrame显示时只展示了日期部分,导致你用纯日期字符串匹配失败。
第一步:先确认真实数据类型
先跑两行代码看看carry_dt的真实情况:
# 查看该列的所有数据类型 print(allHoldings['carry_dt'].apply(type).unique()) # 查看前几行的具体内容 print(allHoldings['carry_dt'].head())
针对不同情况的解决方案
情况1:如果是datetime类型
直接用datetime对象筛选,或者统一转成datetime后用日期方法筛选:
from datetime import datetime import pandas as pd # 方法1:用datetime对象匹配 target_date = datetime(2018, 5, 17) filtered_df = allHoldings.loc[allHoldings['carry_dt'] == target_date] # 方法2:统一转成datetime后,提取日期部分匹配 allHoldings['carry_dt'] = pd.to_datetime(allHoldings['carry_dt']) filtered_df = allHoldings.loc[allHoldings['carry_dt'].dt.date == target_date.date()]
情况2:如果是带时间的字符串
先把字符串转成纯日期格式再筛选:
import pandas as pd # 转成datetime后提取日期部分(变成date对象) allHoldings['carry_dt'] = pd.to_datetime(allHoldings['carry_dt']).dt.date filtered_df = allHoldings.loc[allHoldings['carry_dt'] == datetime(2018,5,17).date()]
通用稳妥方案(推荐)
不管原来是什么类型,先把carry_dt转成datetime类型,后续的日期操作会更灵活:
import pandas as pd # 转换为datetime类型 allHoldings['carry_dt'] = pd.to_datetime(allHoldings['carry_dt']) # 筛选当天所有记录(包括带时间的) filtered_df = allHoldings[allHoldings['carry_dt'].between('2018-05-17', '2018-05-18')] # 或者只匹配日期部分,忽略时间 filtered_df = allHoldings[allHoldings['carry_dt'].dt.normalize() == '2018-05-17']
内容的提问来源于stack exchange,提问作者SBad
相关产品推荐
相关产品推荐

