For Loop 将字符串列表添加到 NetCDF 变量,仅添加最后一个值问题
For Loop adding list of strings to NetCDF variable, only adding last value issue
我正在从许多其他文件创建一个 NetCDF 文件,我唯一的问题是获取一个字符串值并将其写入 NetCDF 变量。现在,下面的代码可以成功写入数据(时间、纬度、经度和其他变量),但它只获取我的站列表“S”中的最后一个值。对于变量 station
。有两种方法可以做到这一点。一种是读写我在下面列出的全局属性站点名称。我还有一个匹配相同值的填充字符串列表。我试过在这里搜索但找不到。也许它在 chartostring
和 stringtochar
命令中?我在这里使用另一个例子,没有任何循环。我想我需要额外的代码来确保它写入所有站名,而不仅仅是最后一个。
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', '51210', '51210', '51210', '51210',
'51210', '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', '51210', '51210', '51210', '51210', '51210', '51210',
'51210', '51210', '51210', '51210'], dtype=object)
原来是我想多了。如果我正在读取列表 S
中的字符串列表,那么是的,我需要执行 stringtochar
和 chartostring
来解构和创建 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']
我正在从许多其他文件创建一个 NetCDF 文件,我唯一的问题是获取一个字符串值并将其写入 NetCDF 变量。现在,下面的代码可以成功写入数据(时间、纬度、经度和其他变量),但它只获取我的站列表“S”中的最后一个值。对于变量 station
。有两种方法可以做到这一点。一种是读写我在下面列出的全局属性站点名称。我还有一个匹配相同值的填充字符串列表。我试过在这里搜索但找不到。也许它在 chartostring
和 stringtochar
命令中?我在这里使用另一个例子,没有任何循环。我想我需要额外的代码来确保它写入所有站名,而不仅仅是最后一个。
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', '51210', '51210', '51210', '51210',
'51210', '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', '51210', '51210', '51210', '51210', '51210', '51210',
'51210', '51210', '51210', '51210'], dtype=object)
原来是我想多了。如果我正在读取列表 S
中的字符串列表,那么是的,我需要执行 stringtochar
和 chartostring
来解构和创建 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']