升级Pandas至2.2.2遇to_datetime弃用警告,求助解决
解决Pandas 2.2.2中read_json触发的to_datetime弃用警告
触发警告的场景
升级Pandas从1.3.5到2.2.2后,执行以下代码时触发了FutureWarning:
from io import StringIO import json import pandas str_data = '{"Keyword":{"0":"TELECOM","1":"OPERATOR","Total":"Total"},"Type":{"0":"job_field","1":"title_class","Total":null},"Seniority Score":{"0":0.0,"1":-1.0,"Total":-1.0}}' df = pandas.read_json(StringIO(str_data), typ='frame', orient='records')
FutureWarning:
在解析字符串时使用'unit'参数的to_datetime行为已被弃用。未来版本中,字符串将被解析为日期时间字符串,与不使用'unit'参数时的行为一致。如需保留旧行为,请在调用to_datetime前显式将整数或浮点数转换为数值类型。
问题根源
你没有主动调用to_datetime,但Pandas的read_json内部在自动推断数据类型时,因JSON中存在混合类型行(比如"Total"行同时包含字符串和数值),导致类型推断逻辑误触发了带unit参数的日期解析逻辑,进而抛出弃用警告。
解决方案
方案1:禁用自动日期转换(推荐)
直接关闭read_json的自动日期转换功能,因为你的数据中不存在日期类型:
df = pandas.read_json(StringIO(str_data), typ='frame', orient='records', convert_dates=False)
方案2:显式指定列数据类型
通过dtype参数明确指定每列的类型,避免Pandas自动推断出错:
dtype_spec = { "Keyword": str, "Type": str, "Seniority Score": float } df = pandas.read_json(StringIO(str_data), typ='frame', orient='records', dtype=dtype_spec)
方案3:预处理JSON拆分混合类型
如果需要保留"Total"行的特殊格式,可以先拆分数据再合并:
data = json.loads(str_data) # 提取Total行数据 total_row = {col: data[col].pop("Total") for col in data} # 先转换普通行,再添加Total行 df = pandas.DataFrame(data) df.loc["Total"] = total_row
效果验证
以上方法均可彻底消除该FutureWarning,同时保证数据解析的准确性。优先选择方案1或2,实现更简洁高效。
内容的提问来源于stack exchange,提问作者Martin Taleski
相关产品推荐
相关产品推荐

