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

Python API轮询获最新数据:变量相等判断异常排查

问题排查:CSV与API数据值相等但判断不匹配

需求是调用API获取数据,与本地CSV存储的数据对比,若有新数据则更新CSV并返回DataFrame。但当前代码中,变量second_cell和lastItem1看起来值相同,却无法通过if相等判断,导致无法进入循环等待新数据。

核心原因

  • 类型不匹配:lastItem1是从pandas DataFrame取出的数值类型(如float64),而second_cell是从CSV读取的字符串类型,不同类型直接比较会返回False。
  • 隐藏空白字符:手动拆分CSV行时,second_cell可能带有换行符(\n)或前后空格,视觉上和lastItem1一致,但实际内容存在差异。

修复方案

  1. 统一数据类型:将CSV读取的字符串转换为数值类型,或直接用pandas读取CSV自动处理类型。
  2. 处理浮点精度:浮点数值比较时,用误差范围替代严格相等判断,避免精度问题。
  3. 优化读取逻辑:用pandas读取CSV,避免手动拆分字符串的潜在错误。

修改后的代码

import pandas_datareader as pdr
import datetime
import pandas as pd

def datagetter():
    i = 1
    while i < 120:
        start = datetime.datetime(2005, 1, 1)
        end = datetime.datetime(2040, 1, 1)
        df = pdr.DataReader('PAYEMS', 'fred', start, end)
        lastItem1 = df["PAYEMS"].iloc[-1]
        print("Latest item from Fred API: ", lastItem1)
        
        # 用pandas读取CSV,自动处理类型和格式
        try:
            df_csv = pd.read_csv('PAYEMS.csv', index_col=0)
            last_csv_value = df_csv["PAYEMS"].iloc[-1]
        except FileNotFoundError:
            # 首次运行无CSV时直接创建并返回
            df.to_csv("PAYEMS.csv")
            print("returning dataframe (CSV created)")
            return df
        
        print("Last Item, in thousands", last_csv_value)
        
        # 浮点数值用误差范围判断相等
        if abs(last_csv_value - lastItem1) < 1e-9:
            print(f"CSV {last_csv_value} API {lastItem1} 数据一致,将继续等待新数据")
            print(f"尝试次数: {i}")
            i += 1
        else:
            df.to_csv("PAYEMS.csv")
            print("returning dataframe")
            return df          

df = datagetter()
print(df.tail(3))

修改说明

  • 用pandas.read_csv替代手动读取拆分CSV,自动处理数据类型和格式,避免字符串操作错误。
  • 浮点比较使用abs(a - b) < 1e-9,规避浮点精度导致的判断失误。
  • 增加了CSV文件不存在的异常处理,首次运行时自动创建文件并返回数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:54:38