如何将多个.dat文件加载到xarray Dataset并设t、M_star为维度?
问题
我有多份.dat文件,分别对应t=1、3、9、10、12等任意时间,每个文件的表格列均为M_star、M_planet、separation,M_star可视为步长0.5的索引,但不同文件的表格长度与M_star取值存在差异。例如:
t=1的文件数据:
M_star M_planet separation 10.0 0.022 7.11 10.5 0.019 2.30 11.0 0.008 14.01
t=3的文件数据:
M_star M_planet separation 9.5 0.308 1.32 10.0 0.522 4.18 10.5 0.019 3.40 11.0 0.338 0.91 11.5 0.150 1.20
我希望将所有.dat文件加载到xarray Dataset中,以便通过指定t和M_star的精确值访问数据,例如用ds.sel(t=9, M_star=10.5)['M_planet']获取对应值。尝试了以下代码但报错:
fnames = glob('table_t=*.dat') fnames.sort() kw = dict(delim_whitespace=True,names=['M_star', 'M_planet', 'separation'], skiprows=1) # 加载所有表格到DataFrame列表 dfs = [pd.read_csv(fname,**kw) for fname in fnames] # 为每个DataFrame添加t列 dfs2= [df_i.assign(t=t) for df_i, z in zip(dfs, [1,2,3,4,9,10,12])] # 转换为xarray Dataset时出错 d = xr.concat([df_i.to_xarray() for df_i in df_s2], dim='t')
报错信息:t already exists as coordinate or variable name.
请问如何将.dat文件加载到xarray并设置t和M_star为维度/坐标?
解决方案
报错原因是你在每个DataFrame里添加了t列,转成xarray后t是变量,而xr.concat又要把t作为拼接维度,导致名称冲突。正确的做法是把t设为每个xarray对象的坐标,而非列变量,具体步骤如下:
修正代码
import glob import pandas as pd import xarray as xr fnames = glob('table_t=*.dat') fnames.sort() kw = dict(delim_whitespace=True, names=['M_star', 'M_planet', 'separation'], skiprows=1) # 处理每个文件,生成带t坐标的xarray Dataset ds_list = [] for fname in fnames: # 从文件名提取t值(适配table_t=X.dat格式) t_val = int(fname.split('t=')[1].split('.dat')[0]) # 加载数据并将M_star设为索引(转xarray后自动成为坐标) df = pd.read_csv(fname, **kw).set_index('M_star') # 新增t维度并设置坐标 ds = df.to_xarray().expand_dims(t=[t_val]) ds_list.append(ds) # 拼接所有Dataset,自动对齐M_star和t坐标 ds = xr.concat(ds_list, dim='t') # 测试数据访问 print(ds.sel(t=9, M_star=10.5)['M_planet'].values)
关键说明
- 设置M_star为坐标:用
set_index('M_star')让M_star成为DataFrame的索引,转成xarray后自动变为坐标维度,满足精确匹配访问的需求。 - 用expand_dims添加t维度:
expand_dims(t=[t_val])给单个文件的xarray对象新增t维度并设置坐标,避免了拼接时的名称冲突。 - 自动坐标对齐:
xr.concat会合并所有文件的M_star和t坐标,缺失的对应数据会填充为NaN,保证Dataset的坐标完整性。
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

