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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 06:45:00