使用sportsreference NBA API获取赛程存DataFrame遇TypeError
报错原因与修正方案
报错核心原因
- 原代码仅访问
dataframe_extended属性但未将返回的DataFrame赋值存储,循环执行后无有效持久化数据 - 循环过程中
mil2019变量被反复覆盖,未对不同球队的赛程数据做合并 TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'是因为dataframe_extended在计算衍生字段(如净胜分、得分差)时,遇到缺失的赛果/时间数据,内部对None值做减法触发报错
修正后代码
import pandas as pd # 若使用新版sportsipy库,将导入路径改为sportsipy即可 from sportsreference.nba.schedule import Schedule league = ['MIL','CHO','LAL','LAC','SAC','ATL','MIA','DAL','POR', 'HOU','NOP','PHO','WAS','MEM','BOS','DEN','TOR','SAS', 'PHI','BRK','UTA','IND','OKC','ORL','MIN','DET', 'NYK','CLE','CHI','GSW'] # 初始化空列表存储各队赛程DataFrame all_team_schedule = [] for team_abbr in league: try: schedule = Schedule(team_abbr, year='2020') # 优先获取扩展赛程,触发空值报错时降级为基础赛程 try: team_df = schedule.dataframe_extended except TypeError: team_df = schedule.dataframe # 添加球队标识列,区分不同队伍的赛程数据 team_df['team_abbr'] = team_abbr all_team_schedule.append(team_df) except Exception as e: print(f"球队{team_abbr}赛程获取失败:{str(e)}") # 合并为全联盟统一的赛程DataFrame total_schedule_df = pd.concat(all_team_schedule, ignore_index=True)
额外说明
- 如果不需要扩展衍生字段,可直接移除扩展字段的降级逻辑,直接使用
schedule.dataframe,从根源避免空值计算报错 - 最终生成的
total_schedule_df即为全联盟所有球队的赛程DataFrame,可直接做后续分析或导出存储
内容的提问来源于stack exchange,提问作者Camilo Arango
相关产品推荐
相关产品推荐

