Pandas匹配最近日期时遇索引错误:‘dtype=int64是无效键’
解决Pandas datetime匹配最近日期时的"int64无效键"索引错误
嘿,这个错误我之前也踩过坑!大概率是日期列没转成datetime类型或者索引操作方式不对导致的,咱们一步步来搞定:
第一步:先把日期列转成Pandas能识别的datetime类型
看你的DataFrame,Date和ICO_to都是字符串格式(比如6/12/2017 18:00),如果直接拿字符串做日期匹配或计算,Pandas没法正确处理,很容易触发索引混乱,抛出无效键的错误。先转换它们:
import pandas as pd # 转换Date和ICO_to列为datetime类型 D1['Date'] = pd.to_datetime(D1['Date']) D1['ICO_to'] = pd.to_datetime(D1['ICO_to'])
转换后,Pandas才能正确计算日期差、排序,避免字符串操作带来的索引异常。
第二步:用正确的方法实现"最近日期匹配"
根据常见需求,分两种场景给出方案:
场景1:找某一个目标日期对应的最近行
比如要找离2017-06-17最近的记录:
target_date = pd.to_datetime('2017-06-17') # 计算每个日期与目标日期的时间差绝对值,取最小的那个的索引 closest_index = (D1['Date'] - target_date).abs().idxmin() # 用.loc获取对应的行(注意:如果你的DataFrame索引不是int,这里会自动用正确的标签索引) closest_row = D1.loc[closest_index]
这里如果之前没转datetime,(D1['Date'] - target_date)会变成字符串拼接,得到的结果根本不是时间差,idxmin()返回的int值自然就成了无效键。
场景2:和另一个DataFrame做最近日期合并(比如用merge_asof)
如果是要把D1和另一个包含日期的DataFrame按最近日期合并,必须确保两个DataFrame的日期列都已排序:
# 假设我们有一个待匹配的DataFrame D2 D2 = pd.DataFrame({ 'match_date': pd.to_datetime(['2017-06-15', '2017-06-20']), 'other_data': ['A', 'B'] }) # 先对两个DataFrame的日期列排序(merge_asof要求必须排序) D1_sorted = D1.sort_values('Date') D2_sorted = D2.sort_values('match_date') # 执行最近日期合并 merged_result = pd.merge_asof( D2_sorted, D1_sorted, left_on='match_date', right_on='Date', direction='nearest' )
如果没排序或者日期列不是datetime,merge_asof会抛出索引相关的错误,包括你遇到的"int64无效键"问题。
最后排查:确认索引操作的正确性
如果还是报错,检查你的索引类型:
- 如果D1的索引不是int64类型(比如是datetime索引),但你用了
D1.loc[123]这种int值去索引,肯定会提示无效键。这时候如果要按位置取行,改用.iloc[123];按标签取的话,要用对应索引类型的值(比如datetime字符串)。
内容的提问来源于stack exchange,提问作者Cole Starbuck
相关产品推荐
相关产品推荐

