首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于循环将字符串列表添加到NetCDF变量,只会添加最后一个值问题

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

Stack Overflow用户
提问于 2021-07-19 15:54:05
回答 1查看 321关注 0票数 0

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

代码语言:javascript
运行
复制
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[:]的上述代码的输出

代码语言:javascript
运行
复制
print(station[:])    
array(['51210', '51210', '51210', '51210', '51210', '51210', '51210',
       '51210', '51210', '51210', '51210'], dtype=object)

上面的一个替代方法是st = S[i],它产生相同的站字符串值。下面看一下这张清单:

代码语言:javascript
运行
复制
print(S)
['41010', '41040', '41110', '42060', '42360', '44020', '44030', '44090', '46060', '51000', '51210']

但同样的错误:

代码语言:javascript
运行
复制
print(station[:])    
array(['51210', '51210', '51210', '51210', '51210', '51210', '51210',
       '51210', '51210', '51210', '51210'], dtype=object)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 14:06:21

结果发现我想得太多了。如果我像在list S中一样读取一个字符串列表,那么是的,我需要执行stringtocharchartostring来解构并创建一个VLEN字符串变量值。但是,从全局属性站点名获取站点名意味着它显然是一个格式正确的字符串,可以在NetCDF文件中使用。因此,在循环中,用i索引站点变量并将其等效为属性站名非常有效,即:

代码语言:javascript
运行
复制
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']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68443517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档