按分钟筛选Pandas DataFrame:多索引时间筛选失效问题
解决多级索引下时间筛选返回空DataFrame的问题
嘿,我之前处理带时间+股票代码的多级索引股票数据时,也碰到过一模一样的问题,大概率是这几个细节没注意到,咱们来逐个排查解决:
时间戳的精度或时区不匹配
很多时候看起来时间字符串完全一致,但实际索引里的时间可能带毫秒级精度,或者时区和你传入的筛选值不统一。比如索引里的时间是2014-05-01 09:32:00.123+00:00,你用精确到秒的字符串筛选自然找不到结果。
先检查索引的时间类型和精度:print(data.index.get_level_values(0).dtype) print(data.index.get_level_values(0).head())如果是精度问题,把索引时间向下取整到秒再筛选:
# 修正索引的时间精度 data.index = data.index.set_levels(data.index.get_level_values(0).floor('S'), level=0) # 再执行筛选 data2 = data.loc[('2014-05-01 09:32:00+00:00', slice(None)), :]如果是时区问题,确保筛选的时间戳和索引时区一致:
# 比如索引是无时区的datetime,就把筛选时间转成无时区 target_time = pd.to_datetime('2014-05-01 09:32:00+00:00').tz_localize(None) data2 = data.loc[(target_time, slice(None)), :]多级索引的层级顺序搞反了
先确认你的多级索引层级顺序是不是[日期, 股票代码],执行print(data.index.names)看看输出。如果实际层级是[股票代码, 日期],那你的筛选位置就错了,应该改成:data2 = data.loc[(slice(None), '2014-05-01 09:32:00+00:00'), :]用
xs方法替代loc更稳妥
Pandas的xs方法专门针对多级索引筛选,语法更直观,不容易出错:# 按第0层(日期)筛选,保留原索引结构 data2 = data.xs('2014-05-01 09:32:00+00:00', level=0, drop_level=False)直接用datetime对象筛选而非字符串
有时候字符串格式的细微差异(比如空格、符号)会导致匹配失败,直接构造datetime对象来筛选更可靠:target_time = pd.to_datetime('2014-05-01 09:32:00+00:00') data2 = data.loc[(target_time, slice(None)), :]
内容的提问来源于stack exchange,提问作者Tartaglia
相关产品推荐
相关产品推荐

