如何用Pandas将Numpy时序数组转为含嵌套values与日期格式的JSON?
问题描述
我有一个shape为(10,2)的Numpy数组:
data = np.ones((10,2))
希望生成如下格式的JSON字符串:
[{ "times":"2022-11-10 00:00:00", "values": { "first": <第一行值>, "second": <第二行值> } }]
目前已编写代码:
dft = pd.DataFrame(data,columns=["first","second"], index=pd.date_range(start_date, periods=len(data), freq=f"15T") ) dft.reset_index(inplace=True) dft = dft.rename(columns={'index': 'times'}) out = dft.to_json(orient='records')
但得到的JSON结果日期是时间戳格式,且没有values嵌套字段:
[{"times":1357041600000,"first":0.0,"second":0.0},{"times":1357042500000,"first":0.0,"second":0.0},{"times":1357043400000,"first":0.0,"second":0.0},{"times":1357044300000,"first":0.0,"second":0.0},{"times":1357045200000,"first":0.0,"second":0.0},{"times":1357046100000,"first":0.0,"second":0.0},{"times":1357047000000,"first":0.0,"second":0.0},{"times":1357047900000,"first":0.0,"second":0.0},{"times":1357048800000,"first":0.0,"second":0.0},{"times":1357049700000,"first":0.0,"second":0.0}]
需要实现两个需求:
- 添加符合规范的
"values"字段,将first和second嵌套进去 - 将
times列转换为YYYY-MM-DD HH:MM:SS格式的日期字符串
解决方案
方法一:基于Pandas DataFrame处理
import numpy as np import pandas as pd data = np.ones((10,2)) start_date = "2022-11-10 00:00:00" # 构造初始DataFrame dft = pd.DataFrame(data, columns=["first","second"], index=pd.date_range(start_date, periods=len(data), freq="15T") ) dft.reset_index(inplace=True) dft = dft.rename(columns={'index': 'times'}) # 1. 将times列转为指定格式的字符串 dft['times'] = dft['times'].dt.strftime('%Y-%m-%d %H:%M:%S') # 2. 构造嵌套的values字段 dft['values'] = dft.apply(lambda row: {'first': row['first'], 'second': row['second']}, axis=1) # 只保留需要的列,转换为格式化的JSON out = dft[['times', 'values']].to_json(orient='records', indent=2) print(out)
方法二:字典推导式(高效处理大数据量)
如果数据量较大,避免使用apply,直接用原生Python构造结果:
import numpy as np import pandas as pd import json data = np.ones((10,2)) start_date = "2022-11-10 00:00:00" # 生成格式化的日期列表 dates = pd.date_range(start_date, periods=len(data), freq="15T").strftime('%Y-%m-%d %H:%M:%S') # 构造目标结构的列表 result = [ { "times": date, "values": {"first": row[0], "second": row[1]} } for date, row in zip(dates, data) ] # 转换为JSON字符串 out = json.dumps(result, indent=2) print(out)
最终输出示例
[ { "times": "2022-11-10 00:00:00", "values": { "first": 1.0, "second": 1.0 } }, { "times": "2022-11-10 00:15:00", "values": { "first": 1.0, "second": 1.0 } } // 剩余8条数据格式同上 ]
内容的提问来源于stack exchange,提问作者gdm
相关产品推荐
相关产品推荐

