Python嵌套字典会话数据处理:错误在会话阶段分布分析求助
会话错误时间分布分析与嵌套JSON解析问题
问题背景
现有包含多会话的嵌套字典数据,每个会话含起止时间,会话桶内有带时间戳的结果(分错误/非错误类型),目标是分析错误更常出现在会话前半段还是后半段。当前使用pd.json_normalize仅能解析第一层buckets,尝试直接访问SessionTimestamps时触发错误:list indices must be integers or slices, not str,同时不清楚如何遍历处理每个会话数据。
报错原因
resp["aggregations"]["Sessioncount"]["buckets"]是列表对象(每个元素对应一个会话的字典数据),而非单个字典。直接用字符串["SessionTimestamps"]索引列表会触发类型错误,必须先遍历列表中的每个会话项,再访问其内部的SessionTimestamps字段。
解决实现
1. 解析嵌套JSON数据
遍历会话列表,提取每个会话的ID、错误类型、时间戳等核心数据,转换为结构化DataFrame:
import pandas as pd # 假设resp为原始字典数据 sessions_data = [] # 遍历每个会话桶 for session in resp["aggregations"]["Sessioncount"]["buckets"]: session_id = session["key"] # 提取当前会话下的所有时间戳条目 timestamp_buckets = session["SessionTimestamps"]["buckets"] for ts_item in timestamp_buckets: # 从key数组中拆分错误类型和时间戳 error_type = ts_item["key"][0] timestamp = ts_item["key"][1] sessions_data.append({ "session_id": session_id, "error_type": error_type, "timestamp": timestamp, "doc_count": ts_item["doc_count"] }) # 转换为DataFrame并处理时间戳格式 df = pd.DataFrame(sessions_data) df["timestamp"] = pd.to_datetime(df["timestamp"])
2. 分析错误时间分布
计算每个会话的时间中点,判断错误结果属于前半段还是后半段,最终统计分布:
# 按会话分组,计算每个会话的起止时间和时间中点 session_time_stats = df.groupby("session_id").agg( start_time=("timestamp", "min"), end_time=("timestamp", "max") ).reset_index() session_time_stats["mid_time"] = session_time_stats["start_time"] + (session_time_stats["end_time"] - session_time_stats["start_time"]) / 2 # 合并时间统计数据,标记每个结果的时间段 df_analysis = df.merge(session_time_stats, on="session_id") df_analysis["time_segment"] = df_analysis.apply( lambda row: "前半段" if row["timestamp"] <= row["mid_time"] else "后半段", axis=1 ) # 统计错误的分布(这里以error_type不为"None"作为错误判断依据) error_distribution = df_analysis[df_analysis["error_type"] != "None"].groupby("time_segment")["doc_count"].sum().reset_index() print(error_distribution)
关键说明
- 必须遍历会话列表而非直接索引:解决
list indices类型错误的核心是先处理列表中的每个会话字典,再访问内部嵌套字段 - 时间戳格式转换:将字符串时间转为
datetime类型,才能进行时长和中点的计算 - 分段判断逻辑:以会话时长的中点为分界,区分每个结果所属的时间段,最终统计错误的分布情况
内容的提问来源于stack exchange,提问作者Dun King
相关产品推荐
相关产品推荐

