如何基于时间戳合并多个JSON对象为Python Pandas DataFrame
问题原因
你之前直接对解析后的整个JSON对象调用pd.read_json()的写法是错的,这种方式会把data下的三个一级key(readingsList/messagesList/userList)识别成行索引,每个key对应的数组整体作为单个单元格的值,自然拆不出你要的结构化字段。
这个场景不需要用json_normalize——三个目标数组都是data节点下的一级数组,没有深层嵌套,直接提取后合并即可。
实现步骤
1. 合并两个列表为DataFrame
先分别提取两个业务列表,统一时间字段名后纵向拼接:
import json import pandas as pd json_str = load_data_gql(...) j = json.loads(json_str) root_data = j["data"] # 分别转成DataFrame,统一时间字段名为timestamp df_read = pd.DataFrame(root_data["readingsList"]).rename(columns={"millis": "timestamp"}) df_msg = pd.DataFrame(root_data["messagesList"]).rename(columns={"dateMillis": "timestamp"}) # 纵向合并,缺失字段自动填充NaN df = pd.concat([df_read, df_msg], ignore_index=True)
2. 时间戳转UTC时间
用pandas自带的时间处理方法直接转换毫秒级时间戳:
# unit="ms"指定是毫秒级时间戳,utc=True指定生成UTC时区的时间 df["datetime_utc"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
3. 转换为用户本地时间
先从userList提取时区配置,再做时区转换:
# 提取用户时区 user_timezone = root_data["userList"][0]["userTimezone"] # 转本地时间,如果不需要时区标识可以去掉tz属性 df["datetime"] = df["datetime_utc"].dt.tz_convert(user_timezone).dt.tz_localize(None)
4. 整理输出格式
按你期望的结构排序、选列即可:
# 按时间倒序排列,和示例输出顺序一致 df = df.sort_values("datetime", ascending=False).reset_index(drop=True) # 调整列顺序 df = df[["datetime", "value", "text", "type", "field1"]]
效果说明
pd.concat会自动对齐两个DataFrame的列名:
- 两个表共有的
value、timestamp字段会合并到同一列 messagesList独有的text/type/field1字段,在来自readingsList的行中会自动填充为NaN,和你给出的期望输出结构完全一致。
内容的提问来源于stack exchange,提问作者walker967
相关产品推荐
相关产品推荐

