You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于时间戳合并多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:27:42