使用bs4爬取NFL排名导出CSV时0值被误转为2000的问题
问题根因
这个格式错误和BeautifulSoup爬取逻辑无关,是自动类型推断导致的:
- 你逐行往DataFrame插入数据时,pandas默认会自动推断每列的数据类型,
胜-负-平格式的战绩字符串(比如03-03-0)刚好匹配短横线分隔的日期字符串特征,会被误转成日期类型,末尾代表平局场数的0会被自动解析为年份,补全成2000。 - 就算写入CSV时原始值是对的,如果你直接双击CSV用Excel打开,Excel自带的单元格自动格式化功能也会把这类长得像日期的字符串转成日期格式,同样会出现末尾0变2000的问题。
修复方法
最直接的解决方式是初始化DataFrame时强制指定所有列的类型为字符串,从根源上禁止pandas做自动类型转换:
# 把你原来的初始化代码 # df = pd.DataFrame(columns = headers) # 替换为下面这行 df = pd.DataFrame(columns=headers, dtype=str)
修改后爬取到的所有战绩字段会按原始爬取到的文本存储,不会再被自动转成日期。
如果后续需要用Excel查看导出的CSV,不要直接双击打开文件,走Excel的「数据」选项卡下的文本/CSV导入向导,导入时把战绩相关列的格式手动选为「文本」,就能避免Excel自动篡改单元格内容。
你可以在导出CSV前加一行打印代码做校验,确认数据格式正确后再导出:
# 把括号里的列名替换成你表格里实际的战绩列名即可 print(df['W-L-T'].head())
内容的提问来源于stack exchange,提问作者Sachin Kumar
相关产品推荐
相关产品推荐

