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

如何解析JSON文件并转换为1分钟粒度时间序列数据

问题:将嵌套JSON解析为1分钟粒度的时间序列数据

输入JSON数据

{
  "walk": [
    {
      "date": "2021-01-10",
      "duration": 301800,
      "levels": {
        "data": [
          {
            "timestamp": "2021-01-10T13:16:00.000",
            "level": "slow",
            "seconds": 360
          },
          {
            "timestamp": "2021-01-10T13:22:00.000",
            "level": "moderate",
            "seconds": 2940
          },
          {
            "dateTime": "2021-01-10T14:11:00.000",
            "level": "fast",
            "seconds": 300
          }
        ]
      }
    }
  ]
}

注:原输入JSON存在语法不完整,已补充必要闭合符号以便代码运行。

需求说明

需要将上述JSON解析为1分钟粒度的时间序列数据:每条记录的seconds字段表示该运动强度持续的秒数,需按每分钟拆分(例如360秒对应6条level为"slow"的记录),最终输出格式如下:

timestamp              level   
2021-01-10 13:16:00     slow
2021-01-10 13:17:00     slow
.......
2021-01-10 13:22:00     moderate

当前代码及问题

用户当前使用的代码仅解析了walk层级,导致levels嵌套在单个单元格中,无法直接处理:

import json
import pandas as pd

with open('walks.json') as f:
    df = pd.json_normalize(json.load(f), 
                           record_path=['walk']
                          )

解决方案

步骤1:解析嵌套的levels.data数组

直接指定record_path到最内层的数据数组,同时保留上层字段(可选):

import json
import pandas as pd

with open('walks.json') as f:
    data = json.load(f)

# 解析嵌套的levels.data,同时提取外层的date字段
df = pd.json_normalize(
    data,
    record_path=['walk', 'levels', 'data'],
    meta=[['walk', 'date']]
)

步骤2:统一时间字段

原JSON中存在timestamp和dateTime两种时间字段名,需合并为统一的时间列:

# 合并两种时间字段为timestamp列
df['timestamp'] = df['timestamp'].fillna(df['dateTime'])
# 转换为datetime类型,删除多余的dateTime列
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.drop('dateTime', axis=1, errors='ignore')

步骤3:生成1分钟粒度的时间序列

根据每条记录的起始时间和持续秒数,生成对应的每分钟时间点,并重复对应level:

# 定义函数生成单条记录的时间序列
def expand_time(row):
    # 计算持续分钟数
    minutes = row['seconds'] // 60
    # 生成从起始时间开始的每分钟时间序列
    time_range = pd.date_range(start=row['timestamp'], periods=minutes, freq='T')
    # 返回包含时间和level的DataFrame
    return pd.DataFrame({
        'timestamp': time_range,
        'level': row['level']
    })

# 对每条记录应用函数,合并结果
result = pd.concat([expand_time(row) for _, row in df.iterrows()], ignore_index=True)

步骤4:格式化输出

将时间格式化为需求的字符串样式:

result['timestamp'] = result['timestamp'].dt.strftime('%Y-%m-%d %H:%M:%S')
# 打印结果(也可保存为文件)
print(result.to_string(index=False))

最终效果

运行上述代码后,将得到符合需求的1分钟粒度时间序列数据,示例片段如下:

timestamp              level   
2021-01-10 13:16:00     slow
2021-01-10 13:17:00     slow
2021-01-10 13:18:00     slow
2021-01-10 13:19:00     slow
2021-01-10 13:20:00     slow
2021-01-10 13:21:00     slow
2021-01-10 13:22:00  moderate
...

内容的提问来源于stack exchange,提问作者prof31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:55:17