如何将pandas Series转换为int类型解决timedelta传参报错
问题原因
你通过.loc条件筛选返回的结果始终是pandas的Series结构,哪怕筛选后只剩1条匹配数据,它也不是单个整数标量。你之前调用tz.astype(int)只是修改了Series内部元素的存储类型,整个变量本质还是Series对象,timedelta的hours参数只接受数值类型,不接受Series,所以会触发类型报错。
从你打印的tz结果也能看出来:
215 -3 Name: summer, dtype: int32
左侧的215是这条数据对应的行索引,这是Series的标准打印格式,说明你拿到的根本不是单独的-3这个数值。
另外你原来的多国家判断写一长串or非常冗余,直接用成员判断in更简洁。
修复方案
- 如果你能确定每个
teamname在时区表里只会匹配到唯一一条记录,直接用.item()方法提取Series里的标量值即可:
# 替换原来的长串or判断 if country in {"Brazil", "DR-Congo", "Indonesia", "Kazakhstan", "Russia"}: tz = files.tz_club.loc[files.tz_club["shrt_nme"] == teamname, "summer"].item() adjust_time = timedelta(hours=tz)
- 如果存在匹配不到数据、或者匹配到多条数据的可能,建议先做空值判断,再取第一条匹配结果,避免运行报错:
if country in {"Brazil", "DR-Congo", "Indonesia", "Kazakhstan", "Russia"}: tz_match = files.tz_club.loc[files.tz_club["shrt_nme"] == teamname, "summer"] if not tz_match.empty: tz = tz_match.iloc[0] adjust_time = timedelta(hours=tz) else: # 这里补充未匹配到时区的兜底处理逻辑,比如给默认值、打日志 tz = 0 adjust_time = timedelta(hours=tz)
内容的提问来源于stack exchange,提问作者SpingoTakagi
相关产品推荐
相关产品推荐

