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

如何将多个.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:03:28