For 循环将字符串列表添加到 NetCDF 变量,只添加最后一个值问题

问题描述

我正在从许多其他文件创建一个 NetCDF 文件,我唯一的问题是获取一个字符串值并将其写入一个 NetCDF 变量。现在,下面的代码可以成功写入数据(时间、纬度、经度和其他变量),但它只获取我的站点“S”列表中的最后一个值。对于变量 station。有两种方法可以做到这一点。一种是读取和写入我在下面列出的全局属性站名。我还有一个匹配相同值的字符串填充列表。我试过在这里搜索,但找不到。也许它在 chartostringstringtochar 命令中?我在这里使用了另一个例子,alebit 没有任何循环。我想我需要额外的代码来确保它写入所有电台名称,而不仅仅是最后一个

import netCDF4 as nc
import numpy as np
import xarray as xr

# create list of station names for dataset writing (listObsFile is list of all NetCDF files) 
S = []
for i in listObsFiles:
    if i.endswith('0h2021.nc'):
        statID = i[8:13]
        S.append(statID)

waveObsNC = nc.Dataset(file,'w')

nstrings = waveObsNC.createDimension('nstrings',len(S)) 
nchars = waveObsNC.createDimension('nchars',5) 

station = waveObsNC.createVariable('station','S5',('station',))
v = waveObsNC.createVariable('v','S1',('nchars'))

for i in range(len(S)):
     File = xr.open_dataset(filepath+'saveWave'+ str(S[i]) +'h2021.nc')
        
     # Read in station data,deconstruct and rebuild to create valid NetCDF variable
     st = File.attrs['station']
     datain = np.array([st],dtype='S5')
     v[:] = nc.stringtochar(datain1)
     station[:] = nc.chartostring(v[:])  
       
# waveObsNC.close()

上述 station[:] 代码输出

print(station[:])    
array(['51210','51210','51210'],dtype=object)

上面的替代方法st = S[i],它产生相同的站字符串值。看看这个列表:

print(S)
['41010','41040','41110','42060','42360','44020','44030','44090','46060','51000','51210']

但同样的错误

print(station[:])    
array(['51210',dtype=object)

解决方法

事实证明是我多虑了。如果我正在阅读列表 S 中的字符串列表,那么是的,我需要执行 stringtocharchartostring 来解构并创建一个 VLEN 字符串变量值。但是,在从全局属性站名中获取站名的地方​​执行此操作意味着它显然是已在 NetCDF 文件中使用的格式正确的字符串。因此,在循环中,使用 i 索引站变量并将其等于属性站名效果很好,即:

for i in range(len(S)):
     File = xr.open_dataset(filepath+'saveWave'+ str(S[i]) +'h2021.nc')
        
     # Read in station data,deconstruct and rebuild to create valid NetCDF variable
     station[i] = File.attrs['station']