鱼C论坛

 找回密码
 立即注册
查看: 198|回复: 8

透过akshare获取数据一直失败

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
20鱼币
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”
应该如何处理?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
按照您提供的步骤操作,结果还是数据获取失败:Length mismatch: Expected axis has 1 elements, new values have 50 elements
None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
奥斯尔 发表于 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 = [f"列{i}" for i in range(1, 51)]
        
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
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, Apr  2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)]
pandas version: 2.0.3
数据获取失败:Length mismatch: Expected axis has 1 elements, new values have 50 elements
None

进程已结束,退出代码为 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
奥斯尔 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
不是你的问题,是 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     )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
用 tushare 吧,那个官方有在持续维护。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
我看了官方文档 -> https://akshare.akfamily.xyz/changelog.html

futures_zh_spot 接口在好几次更新中都持续被 “修复”,说明一直是处于被屏蔽和修复的过程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-24 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表