奥斯尔 发表于 2025-2-17 23:07:13

透过akshare获取数据一直失败

import sys
import pandas as pd
import akshare as ak



def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")


def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      print("\nAKShare数据获取成功!样例数据:")
      return df.head(5)
    except Exception as e:
      print(f"数据获取失败:{str(e)}")
if __name__ == "__main__":
    check_environment()
    print(test_akshare())


运行后显示“数据获取失败:Length mismatch: Expected axis has 1 elements, new values have 50 elements”
应该如何处理?

小甲鱼的二师兄 发表于 2025-2-17 23:07:14

我看了官方文档 -> https://akshare.akfamily.xyz/changelog.html

futures_zh_spot 接口在好几次更新中都持续被 “修复”,说明一直是处于被屏蔽和修复的过程。

FishC 发表于 2025-2-17 23:07:25

这个错误通常意味着你的数据结构不匹配,可能是由于表头或数据格式的变化导致的。你可以尝试以下步骤来解决问题:

1. 确认akshare是否是最新版本
首先,确保你的akshare是最新版本。可以通过以下命令升级:

pip install --upgrade akshare


2. 检查返回的数据结构
尝试打印返回的完整数据帧,看看数据结构是什么样的:

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      print("\nAKShare数据获取成功!样例数据:")
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")


3. 调整数据解析逻辑
如果数据的列名发生了变化,可以调整你的代码来适应新的数据结构。下面是一个示例:


import sys
import pandas as pd
import akshare as ak

def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      # 打印列名以查看数据结构
      print("列名:", df.columns)
      
      # 如果知道新列名,可以手动设置
      # df.columns = ["新列名1", "新列名2", ...]

      print("\nAKShare数据获取成功!样例数据:")
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")

if __name__ == "__main__":
    check_environment()
    print(test_akshare())


通过这些步骤你应该能够更好地调试和解决数据获取失败的问题。如果问题仍然存在,可以提供更多的错误信息或数据样本以便进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

奥斯尔 发表于 2025-2-17 23:38:50

按照您提供的步骤操作,结果还是数据获取失败:Length mismatch: Expected axis has 1 elements, new values have 50 elements
None

FishC 发表于 2025-2-17 23:39:06

奥斯尔 发表于 2025-02-17 23:38
按照您提供的步骤操作,结果还是数据获取失败:Length ...

看起来问题依然存在,这可能是因为AKShare返回的数据结构在列名上发生了变化。为了进一步调试,我们可以打印一些更详细的信息,看看数据的具体结构是什么样的。

你可以尝试如下代码,直接打印获取到的数据帧的列名和内容,以帮助我们找出问题:

import sys
import pandas as pd
import akshare as ak

def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      # 打印获取到的数据帧的列名和头几行(完整输出)
      print("\nAKShare数据获取成功!列名和样例数据:")
      print(df.columns)
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")

if __name__ == "__main__":
    check_environment()
    print(test_akshare())

请运行这段代码,看看打印出来的数据帧的列名和数据结构是什么样子的。这将有助于确定数据列名的问题。

如果数据的列名和预期的不一致,可以手动设置列名来解决这个问题。例如:

import sys
import pandas as pd
import akshare as ak

def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      # 查看原始列名和数据结构
      print("原始列名:", df.columns)
      print("原始数据样例:", df.head(5))
      
      # 根据实际情况设置新列名(假设新列名为["列1", "列2", ..., "列50"])
      df.columns =
      
      print("\nAKShare数据获取成功!新的列名和样例数据:")
      print(df.columns)
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")

if __name__ == "__main__":
    check_environment()
    print(test_akshare())

希望这次能够帮助你解决问题。请确保在运行时检查每一步的输出,找到导致错误的确切原因。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

奥斯尔 发表于 2025-2-17 23:41:16

import sys
import pandas as pd
import akshare as ak

def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      # 打印获取到的数据帧的列名和头几行(完整输出)
      print("\nAKShare数据获取成功!列名和样例数据:")
      print(df.columns)
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")

if __name__ == "__main__":
    check_environment()
    print(test_akshare())

这段代码也是运行不了,输出内容是Python version: 3.11.9 (tags/v3.11.9:de54cf5, Apr2 2024, 10:12:12)
pandas version: 2.0.3
数据获取失败:Length mismatch: Expected axis has 1 elements, new values have 50 elements
None

进程已结束,退出代码为 0

FishC 发表于 2025-2-17 23:41:28

奥斯尔 发表于 2025-02-17 23:41
import sys
import pandas as pd
import akshare as ...

从错误信息来看,问题依然是数据帧的列数量与期望不符。我们需要进一步检查返回的数据是什么样子。你可以尝试打印获取的数据帧的内容,而不仅仅是列名和部分行,以便更好地理解数据返回的形式。

你可以修改代码,在捕获异常时打印完整的返回数据,以便查看实际内容:

import sys
import pandas as pd
import akshare as ak

def check_environment():
    print(f"Python version: {sys.version}")
    print(f"pandas version: {pd.__version__}")

def test_akshare():
    try:
      df = ak.futures_zh_spot(
            symbol="RB9999",
            market="上海期货交易所",
            adjust=''
      )
      # 打印获取到的数据帧的列名和头几行(完整输出)
      print("\nAKShare数据获取成功!列名和样例数据:")
      print(df.columns)
      print(df.head(5))
      return df
    except Exception as e:
      print(f"数据获取失败:{str(e)}")
      # 打印返回的完整数据
      raw_data = ak.futures_zh_spot(symbol="RB9999", market="上海期货交易所", adjust='')
      print("返回的完整数据:", raw_data)

if __name__ == "__main__":
    check_environment()
    print(test_akshare())

通过添加 raw_data 的输出,你可以看到返回的实际数据。这将帮助我们确定导致错误的根本原因。有可能是期望的数据结构和实际返回的不一致。请尝试运行修改后的代码并查看完整的返回内容。

如果数据非常大或者格式难以阅读,可以考虑仅打印一部分数据,例如:

print("返回的前200个字符:", str(raw_data)[:200])

希望这些步骤能够帮助你找到问题的根源并解决它。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2025-2-24 01:26:00

不是你的问题,是 sina 的接口变了,使用官方用例依然报错:

import akshare as ak

futures_zh_spot_df = ak.futures_zh_spot(symbol='V2205', market="CF", adjust='0')
print(futures_zh_spot_df)

try:
--> 418   data_df.columns = [
    419         "symbol",
    420         "time",
    421         "open",
    422         "high",
    423         "low",
    424         "last_close",
    425         "bid_price",
    426         "ask_price",
    427         "current_price",
    428         "avg_price",
    429         "last_settle_price",
    430         "buy_vol",
    431         "sell_vol",
    432         "hold",
    433         "volume",
    434         "_",
    435         "_",
    436         "_",
    437         "_",
    438         "_",
...
   99         f"Length mismatch: Expected axis has {old_len} elements, new "
    100         f"values have {new_len} elements"
    101   )

小甲鱼的二师兄 发表于 2025-2-24 01:26:55

用 tushare 吧,那个官方有在持续维护。
页: [1]
查看完整版本: 透过akshare获取数据一直失败