Python处理请求JSON转DataFrame报TypeError: string indices must be integers
错误根因
你代码中iot_trimmed的实际类型是JSON格式的字符串,并非Python字典,因此无法直接通过键名['default']做索引,触发string indices must be integers报错。
你打印的iot_trimmed内容只是JSON格式的字符串字面量,和Python可直接操作的字典是完全不同的数据类型。
修复步骤
- 对切割后的
iot_trimmed字符串做JSON反序列化,转成Python字典后再提取字段 - 顺便补充你代码末尾
apply行遗漏的右括号,避免后续语法报错
修复后的核心代码片段
import json import pandas as pd import requests # 你之前的请求代码保持不变 over_time_req_payload = { 'req': json.dumps(interest_over_time_widget['request']), 'token': interest_over_time_widget['token'], 'tz': timezone } req_json_interest_over_time = requests.get(interest_over_time_url, params=over_time_req_payload, cookies=cookies, headers={'accept-language': 'us'}) iot_trimmed = req_json_interest_over_time.text[len(data_trim):] # 新增:将JSON字符串反序列化为Python字典 iot_dict = json.loads(iot_trimmed) # 用反序列化后的字典取字段 df = pd.DataFrame(iot_dict['default']['timelineData']) df['date'] = pd.to_datetime(df['time'].astype(dtype='float64'), unit='s') df = df.set_index(['date']).sort_index() # 补充了末尾缺失的右括号 result_df = df['value'].apply(lambda x: pd.Series( str(x).replace('[', '').replace(']', '').split(',')))
验证方法
你可以在切割完iot_trimmed后加一行打印类型的代码确认:
print(type(iot_trimmed)) # 输出会是<class 'str'>,验证是字符串类型 print(type(iot_dict)) # 反序列化后输出为<class 'dict'>
内容的提问来源于stack exchange,提问作者Ivan Raykov
相关产品推荐
相关产品推荐

