如何使用 xarray 将数据放入文件 netCDF 的数据变量部分

问题描述 投票:0回答:1

问题

我正在编写一个读取 excel 文件并提取数据并将其放入 netcdf 文件的程序,问题是我无法将数据放入数据变量部分。为此,我使用 xarray 和 pandas。这是我的代码:

# Ouvrir le xlsx
df = pd.read_excel('./data/data_example/data_compilees_grappe/compil_Guyane_Nov2017_J1-2_181.xlsx')

# On recupere les noms des colonnes
col_names = df.columns.tolist()

# fais le tris dans les données : on supprime les parenthèses MAIS on garde les valeurs entre parenthèse
# Par exemple : 'Time(ms)' on stock dans une variable 'Time' et on garde la valeur 'ms'
# On créé une liste vide pour stocker les noms des colonnes
col_names_clean = []
# On créé une liste vide pour stocker les unités
col_units = []
# On créé une liste vide pour les noms des colonnes qui n'ont pas d'unité
col_names_no_unit = []

# On parcours la liste des noms des colonnes
for col_name in col_names:
    # si il n'y a pas de parenthèses dans le nom de la colonne on l'ajoute dans la liste des noms de colonnes mais pas dans la liste des unités
    if "(" in col_name and "Beta" not in col_name:
    # On récupere les valeurs entre parenthèses
        col_unit = col_name[col_name.find("(")+1:col_name.find(")")]
        # On supprime les parenthèses
        col_name = col_name.replace("("+col_unit+")", "")
        # On ajoute le nom de la colonne dans la liste des noms de colonnes
        col_names_clean.append(col_name)
        # On ajoute l'unité dans la liste des unités
        col_units.append(col_unit)
    else:
        # On ajoute le nom de la colonne dans la liste des noms de colonnes sans unité
        col_names_no_unit.append(col_name)

print(col_names_no_unit)        

# On créé un dictionnaire pour stocker les noms des colonnes et les unités
col_names_units = dict(zip(col_names_clean, col_units))

# On met les parametres globaux
global_attributes = {
    'title': 'Data from Guyane',
    'institution': 'CNRS',
    'source': 'Data from Guyane',
    'history': 'Created by the CNRS',
    'references': 'https://www.cnrs.fr/',
    'comment': 'Data from Guyane',
    'Conventions': 'CF-1.6',
}

# on choppe les valeurs de la colonne en rajoutant le nom de la colonne et l'unite
# time = sorted(list(set(df[col_names_clean[0]+"("+col_names_units[col_names_clean[0]]+")"])))

# On fais pareil pour toutes les autres colonnes
# On créé une liste vide pour stocker les valeurs de chaque colonne
col_values1 = []
# On parcours la liste des noms de colonnes
for col_name in col_names_clean:
    # On ajoute les valeurs de la colonne dans la liste des valeurs
    col_values1.append(sorted(list(set(df[col_name+"("+col_names_units[col_name]+")"]))))
    
# On créé un dictionnaire pour stocker les noms des colonnes et les valeurs
col_names_values = dict(zip(col_names_clean, col_values1))

# On créé une liste vide pour stocker les valeurs de chaque colonne (sans unité)
col_values2 = []
# On parcours la liste des noms de colonnes
for col_name in col_names_no_unit:
    # On ajoute les valeurs de la colonne dans la liste des valeurs
    col_values2.append(sorted(list(set(df[col_name]))))

# On créé un dictionnaire pour stocker les noms des colonnes et les valeurs 
col_names_values2 = dict(zip(col_names_no_unit, col_values2))

# On créé la dataset
ds = xr.Dataset(
    coords = {
        # On prend les valeurs de col_names_values en fonction du nom
        col_name: (col_name, col_names_values[col_name]) for col_name in col_names_clean
    },  
# Here the problem :
    data_vars= {col_name: (col_name, col_names_values2[col_name]) for col_name in col_names_no_unit},
    attrs = global_attributes
)

这是我运行代码时得到的结果,我只想让它在坐标部分显示:时间、压力、温度条件、盐、CHL。我不明白为什么变量会放在那里。有人有解决方案吗?

<xarray.Dataset>
Dimensions:      (_G100_: 1, _G125_: 1, _G150_: 1, bbp_VSF_532: 1113,
                  Beta(488): 146, Beta(510): 38, Beta(532): 1, Beta(595): 1,
                  Beta(650): 194, Beta(676): 1, Beta(715): 1, Beta(765): 1,
                  Beta(865): 1, bbp488: 1148, bbp510: 1136, bbp532: 1113,
                  bbp595: 1081, bbp650: 1130, bbp676: 1101, bbp715: 1111,
                  bbp765: 258, bbp865: 258, CDOM-ppb: 283, a401: 1175,
                  ...
                  c716: 1064, c717: 1064, c718: 1064, c719: 1066, c720: 1066,
                  c721: 1066, c722: 1066, c723: 1068, c724: 1068, c725: 1068,
                  c726: 1068, c727: 1075, c728: 1075, c729: 1075, c730: 1075,
                  c731: 1083, c732: 1083, c733: 1083, c734: 1083, c735: 1011,
                  c736: 1090, Time: 1317, Pres: 126, Temp: 201, Cond: 219,
                  Sal: 258, CHL: 54)
Coordinates: (12/701)
  * _G100_       (_G100_) float64 0.07232
  * _G125_       (_G125_) float64 0.04619
  * _G150_       (_G150_) float64 0.03993
  * bbp_VSF_532  (bbp_VSF_532) float64 0.3963 0.3963 0.3963 ... 0.4004 0.4005
  * Beta(488)    (Beta(488)) float64 0.1157 0.1163 0.1174 ... 0.1339 0.134 0.134
  * Beta(510)    (Beta(510)) float64 0.1021 0.1025 0.1026 ... 0.1036 0.1036
    ...           ...
  * Time         (Time) int32 2300 2550 2800 3050 ... 337800 338050 338300
  * Pres         (Pres) float64 0.26 0.27 0.377 0.465 ... 0.687 0.693 0.696
  * Temp         (Temp) float64 29.9 29.91 29.91 29.91 ... 30.03 30.03 30.03
  * Cond         (Cond) float64 4.521 4.617 4.617 4.617 ... 4.633 4.635 4.636
  * Sal          (Sal) float64 26.3 26.92 26.92 26.92 ... 27.06 27.08 27.08
  * CHL          (CHL) float64 1.85 1.856 1.869 1.882 ... 2.202 2.208 2.221
Data variables:
    *empty*
Attributes:
    title:        Data from Guyane
    institution:  CNRS
    source:       Data from Guyane
    history:      Created by the CNRS
    references:   https://www.cnrs.fr/
    comment:      Data from Guyane
    Conventions:  CF-1.6

解决方案:

您只需要为您的变量添加一个“描述”,使其适合 data_variable 部分。例如:

for i in col_names_clean:
        # On ajoute les valeurs de la colonne dans le dictionnaire coords
        coords[i] = ("Coords", col_names_values[i])
    
    # On créé une dataset avec toutes les valeurs et on y met dans la section Data Variables
    ds = xr.Dataset(
        coords=coords,
        
        data_vars={
            i: ("Variables", col_names_values2[i]) for i in col_names_no_unit
        },
        attrs=global_attributes
    )

这里是终端中的结果:

<xarray.Dataset>
Dimensions:      (Variables: 1317, Coords: 1317)
Coordinates:
    Time         (Coords) int32 2300 2550 2800 3050 ... 337800 338050 338300
    Pres         (Coords) float64 0.567 0.567 0.567 0.646 ... 0.26 0.26 0.26
    Temp         (Coords) float64 29.92 29.92 29.92 29.92 ... 29.98 29.98 29.98
    Cond         (Coords) float64 4.636 4.636 4.636 4.635 ... 4.62 4.62 4.62
    Sal          (Coords) float64 27.08 27.08 27.08 27.08 ... 26.95 26.95 26.95
    CHL          (Coords) float64 2.003 2.003 2.003 1.978 ... 1.997 1.997 1.997
Dimensions without coordinates: Variables, Coords
Data variables: (12/695)
    _G100_       (Variables) float64 0.07232 0.07232 0.07232 ... 0.07232 0.07232
    _G125_       (Variables) float64 0.04619 0.04619 0.04619 ... 0.04619 0.04619
    _G150_       (Variables) float64 0.03993 0.03993 0.03993 ... 0.03993 0.03993
    bbp_VSF_532  (Variables) float64 0.3988 0.3988 0.3988 ... 0.3963 0.3963
    Beta(488)    (Variables) float64 0.134 0.134 0.134 ... 0.124 0.1174 0.1174
    Beta(510)    (Variables) float64 0.1036 0.1036 0.1036 ... 0.1029 0.1029
    ...           ...
    c731         (Variables) float64 38.88 38.88 38.88 ... 33.13 33.13 33.13
    c732         (Variables) float64 38.91 38.91 38.91 ... 33.24 33.24 33.24
    c733         (Variables) float64 38.94 38.94 38.94 ... 33.34 33.34 33.34
    c734         (Variables) float64 38.96 38.96 38.96 ... 33.45 33.45 33.45
    c735         (Variables) float64 38.99 38.99 38.99 ... 33.56 33.56 33.56
    c736         (Variables) float64 38.92 38.92 38.92 ... 33.44 33.44 33.44
Attributes:
    title:        Data from Guyane
    institution:  CNRS
    source:       Data from Guyane
    history:      Created by the CNRS
    references:   https://www.cnrs.fr/
    comment:      Data from Guyane
    Conventions:  CF-1.6
python pandas netcdf python-xarray
1个回答
0
投票

我不确定我是否正确理解了你的问题,但你似乎混淆了数据变量和维度。使用

xarray.Dataset
时,您应该将维度指定为参数,而不是重复
col_name
.

所以,而不是:

data_vars= {col_name: (col_name, col_names_values2[col_name]) for col_name in col_names_no_unit}

我建议你使用:

data_vars= {col_name: (["Time", "Pres", "Temp Cond", "Sal", "CHL"], col_names_values2[col_name]) for col_name in col_names_no_unit}

或不久

data_vars= {col_name: (col_names_clean, col_names_values2[col_name]) for col_name in col_names_no_unit}

如果我理解的很好。

尽管如此,您可以通过指出您的维度、坐标和变量是什么以及它们与

col_names_clean
col_names_no_unit
的关系来更准确地回答您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.