如何解析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
相关产品推荐
相关产品推荐

