为何无法用日期作为元组索引部分查询Pandas DataFrame行?
这个问题我之前折腾过好一会儿!大概率是你索引里的日期不是字符串类型,而是datetime对象,所以直接拿字符串'11-01-2018'去匹配肯定找不到。下面给你几个实用的解决办法:
方法一:转换查询日期为匹配的datetime类型
先确认下索引里日期部分的类型,跑一行代码看看:
print(df.index.get_level_values(0).dtype)
如果输出是datetime64[ns],那你需要把查询的字符串转成datetime对象再用.loc查询:
import pandas as pd # 注意format要和你的日期字符串格式对应,比如这里是月-日-年 target_date = pd.to_datetime('11-01-2018', format='%m-%d-%Y') # 现在就能精准匹配到目标行了 target_row = df.loc[(target_date, 'GBPUSD')]
要是你的日期格式是日-月-年,记得把format改成%d-%m-%Y,别搞反了!
方法二:把索引的日期层转为字符串类型
如果你就想直接用字符串查询,那可以把索引里的日期统一转成字符串格式:
# 把索引第0层(日期)转成指定格式的字符串 df.index = df.index.set_levels( df.index.get_level_values(0).strftime('%m-%d-%Y'), level=0 ) # 现在直接用字符串元组就能查到了 target_row = df.loc[('11-01-2018', 'GBPUSD')]
不过要注意,这种操作会改变索引的类型,后续如果要做时间序列相关的运算(比如按日期切片)可能会不方便,按需选择就行。
方法三:用布尔索引临时过滤
不想修改索引的话,也可以直接用布尔条件过滤出目标行:
# 先构造匹配条件 date_match = df.index.get_level_values(0) == pd.to_datetime('11-01-2018', format='%m-%d-%Y') pair_match = df.index.get_level_values(1) == 'GBPUSD' # 合并条件并过滤 target_row = df[date_match & pair_match]
这种方法适合临时查询,不会改动原DataFrame的结构。
最后补充个小提醒:如果索引里的日期本来就是字符串,但格式和你用的查询字符串不一样(比如索引是'2018-11-01',你用'11-01-2018'查),那也要先统一格式,要么改索引的字符串格式,要么把查询字符串转成和索引一致的格式再查。
内容的提问来源于stack exchange,提问作者Davtho1983
相关产品推荐
相关产品推荐

