从spacepy返回的字典创建pandas DataFrame报错如何解决
问题根源
- spacepy的
get_omni返回的所有字段都是包含大量冗余单维度的高维ndarray,不是pandas构造DataFrame要求的一维序列,会触发维度超限、形状不匹配报错 time_data['W']的维度顺序是「时间步 × 6个W参数」,你之前用[0]索引取到的是第一个时间点的所有W值,长度为6,和其他字段的长度36不匹配,触发数组长度不一致报错
解决方案
直接对每个字段调用numpy的squeeze()方法移除所有长度为1的冗余维度,再按正确的维度顺序提取W参数即可,修正后代码如下:
# 待格式化为pandas数据框的参数:PDYN, DST, BYIMF, BZIMF, W1, W2, W3, W4, W5, W6。 # 导入所需模块 import numpy as np import datetime as dtm import pandas as pd import spacepy import spacepy.time as spt import spacepy.omni as spo # 起始时间:2003-10-29T06:00:00 (DST = -10nT) # 结束时间:2003-10-30T17:00:00 (DST = -97nT) # 用spacepy提取指定时间区间内的数据 start_time = dtm.datetime(2003, 10, 29, 6) # 起始时间 end_time = dtm.datetime(2003, 10, 30, 17) # 结束时间 dt = dtm.timedelta(hours = 1) # 时间步长 ticks = spt.tickrange(start_time, end_time, dt, 'UTC') # 时间刻度范围 time_data = spo.get_omni(ticks) # 生成数据字典 # 预处理:移除所有字段的冗余维度 ticks_arr = time_data['ticks'].squeeze() pdyn_arr = time_data['Pdyn'].squeeze() dst_arr = time_data['Dst'].squeeze() by_arr = time_data['ByIMF'].squeeze() bz_arr = time_data['BzIMF'].squeeze() w_arr = time_data['W'].squeeze() # 处理后形状为 (36, 6),第一维是时间步,第二维是W1-W6 # 用Pandas创建数据框 d = { 'Time Stamp': ticks_arr, 'PDYN': pdyn_arr, 'DST': dst_arr, 'BYIMF': by_arr, 'BZIMF': bz_arr, 'W1': w_arr[:,0], 'W2': w_arr[:,1], 'W3': w_arr[:,2], 'W4': w_arr[:,3], 'W5': w_arr[:,4], 'W6': w_arr[:,5] } df = pd.DataFrame(data = d) df
验证方法
构造字典前可以先打印各数组的形状确认预处理正确:
print(ticks_arr.shape) # 预期输出 (36,) print(w_arr.shape) # 预期输出 (36, 6)
确认形状匹配后即可正常构造DataFrame。
内容的提问来源于stack exchange,提问作者Anthony Knighton
相关产品推荐
相关产品推荐

