You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Currency和Date合并DataFrame失败问题求助

解决DataFrame合并匹配失败的思路

嘿,我来帮你一步步排查这个合并匹配失败的问题,咱们从最常见的原因开始梳理:

1. 先确认货币代码完全一致

首先要排查df['currency_str']和xrate['Currency']的取值是不是完全匹配——比如有没有大小写差异(比如cad vs CAD)、多余空格或者特殊字符?你可以跑这段代码看看:

# 打印两个列的唯一值,对比差异
print("df中的货币类型:", df['currency_str'].unique())
print("xrate中的货币类型:", xrate['Currency'].unique())

如果发现有大小写或者格式问题,统一转成大写(或小写)就能解决:

df['currency_str'] = df['currency_str'].str.strip().str.upper()
xrate['Currency'] = xrate['Currency'].str.strip().str.upper()

2. 检查日期列的匹配细节

虽然你已经把两个日期列转成了datetime64[ns],但还有几个坑要注意:

  • 日期精度问题:xrate['Date']是纯日期(没有时分秒),而你从created_date_time转换来的列,会不会残留了时分秒?可以用这段代码验证:
    # 查看xrate日期的时间部分,纯日期的话会输出[NaT]
    print("xrate日期的时间部分:", xrate['Date'].dt.time.unique())
    # 查看df格式化后日期的时间部分
    print("df日期的时间部分:", df['formatted_created_date_time'].dt.time.unique())
    
    如果df的日期有时间部分,直接用floor('D')把时间清零:
    df['formatted_created_date_time'] = df['formatted_created_date_time'].dt.floor('D')
    xrate['Date'] = xrate['Date'].dt.floor('D')
    
  • 日期范围是否重叠:从你给出的xrate样本来看,它的日期是2018年的,你得确认df里的formatted_created_date_time是不是在xrate的日期范围内:
    print("xrate的日期范围:", xrate['Date'].min(), "→", xrate['Date'].max())
    print("df的日期范围:", df['formatted_created_date_time'].min(), "→", df['formatted_created_date_time'].max())
    
    如果df的日期都是比xrate晚很多的,那肯定匹配不到,得检查数据来源是不是正确。

3. 验证具体的(货币+日期)组合是否存在

可以生成组合键,直接查看df里哪些组合在xrate中找不到:

# 创建货币+日期的组合键
df['combined_key'] = df['currency_str'] + '_' + df['formatted_created_date_time'].astype(str)
xrate['combined_key'] = xrate['Currency'] + '_' + xrate['Date'].astype(str)

# 找出df中不存在于xrate的组合键
missing_keys = df[~df['combined_key'].isin(xrate['combined_key'])]['combined_key'].unique()
print("找不到匹配的组合键数量:", len(missing_keys))
print("部分缺失的组合:", missing_keys[:10])

这能帮你快速定位到底是哪些具体的(货币+日期)对没有匹配到,是数据缺失还是格式问题。

4. 排查时区问题

从你的系统时间截图来看是CST时区,要确认两个日期列的时区是否一致:

print("xrate Date列的时区:", xrate['Date'].dt.tz)
print("df格式化日期列的时区:", df['formatted_created_date_time'].dt.tz)

如果一个带时区、一个不带,会导致匹配失败,统一时区就好:

# 把带时区的列转成无时区(以xrate为例)
xrate['Date'] = xrate['Date'].dt.tz_localize(None)

5. 小样本手动验证

拿df里的几行数据,手动去xrate里查有没有匹配项,比如:

# 取df前3行的货币和日期
sample = df[['currency_str', 'formatted_created_date_time']].head(3)
print("待匹配的样本:")
print(sample)

# 在xrate中查找对应匹配
matches = xrate[(xrate['Currency'].isin(sample['currency_str'])) & (xrate['Date'].isin(sample['formatted_created_date_time']))]
print("xrate中找到的匹配项:")
print(matches)

如果这一步都找不到结果,那要么是这些样本的(货币+日期)在xrate里确实不存在,要么还是格式没对齐。


内容的提问来源于stack exchange,提问作者Peter Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:05