Python如何从NetCDF文件创建的数据中填充列表中缺少的数据

Python如何从NetCDF文件创建的数据中填充列表中缺少的数据,python,netcdf,Python,Netcdf,我正在尝试编写一些Python代码,读取澳大利亚气象局雨量计NetCDF文件,并提取集水区中一组雨量计的降雨量。格式有点奇怪。他们选择创建一个时间步长文件,其中包含该时间步长的所有记录值?但是,当仪表未记录值且测站丢失时。我想尝试找到丢失的站点,并简单地创建一个零降雨量值。我已经识别了站点ID,但是如何将零记录添加到列表中 以下是代码的一部分: # First LOOP through all files for the day and accumulate data. for timestep

我正在尝试编写一些Python代码,读取澳大利亚气象局雨量计NetCDF文件,并提取集水区中一组雨量计的降雨量。格式有点奇怪。他们选择创建一个时间步长文件,其中包含该时间步长的所有记录值?但是,当仪表未记录值且测站丢失时。我想尝试找到丢失的站点,并简单地创建一个零降雨量值。我已经识别了站点ID,但是如何将零记录添加到列表中

以下是代码的一部分:

# First LOOP through all files for the day and accumulate data.
for timestep, datafile in enumerate(stationdata):
    print datafile[-16:-3]
    data = netcdf.NetCDFFile(datafile, 'r')
try:
    precip = data.variables['precipitation'].data
except:
    precip = data.variables['precip'].data
try:
    stid = data.variables['station_id'].data
except:
    stid = data.variables['stid'].data
# create np array of indices of the gauge id present in the current file (Note not ALL required ones may be present!!)
idx = np.where(np.in1d(stid, gauge_ids))[0]
print 'index len = '+str(len(idx))+' Gauges: '+str(ngauges)
# This process DOES NOT SEEM to Capture Missing Gauge Data
# If a Gauge ID is not present how to we set its value to Zero for this time step ?
for i in idx:
    print i,stid[i],precip[i], timestep
    timeseries_per_station[str(stid[i])][timestep] = precip[i] # This adds the rainfall to the time series for the Station ID in the found set from its index
data.close()
# Now go through the list of Gauges ngauges with IDs gauge_ids, and fill missing ones with zero
# For stid not in gauge_ids set to Zero ... How ???
# create a Zero list and remove ID's that already have values ??
# Try    [i for i in a if i not in b]
print [k for k in gauge_ids if k not in stid]
for l in [k for k in gauge_ids if k not in stid]:
    print l, timestep
    timeseries_per_station[l][timestep] = 0.0
raw_input('check..')
表示l in[k表示k in仪表_id,如果k不在stid]:
按预期标识缺失的桩号,但
timeseries\u per_桩号[l][timestep]=-1.0
会导致
索引器:索引超出范围
。这就是我想要将丢失的数据设置为可识别值的地方

当代码到达的数据段少于原始站点数(26)且仅读取25或24个etc时,会出现此错误吗

任何线索都会很有帮助

另一种方法是使用不同的结构将数据读入:结构应如下所示:对于每个时间片数据文件,都有雨量计站的数据,例如ID、纬度、经度、降水量。我想画出降水量的空间变化和每个时间片的空间变化。时间片数据包含在时间片文件的文件名中


谢谢

由于我们没有数据和完整的python脚本,所以很难看到这里发生的一切,但作为起点,您可以:

  • 查找所有站点可用的最大观测数(例如,
    maxN
    )和最大站点数(
    maxS
  • 创建一个Numpy数组来保存从以下文件读取的数据:
    mydata=Numpy.zeros((maxS,maxN))
  • 开始从文件中读取数据并按当前操作进行填写,但使用从开始到结束时间步计数的索引。如果在文件中找不到当前时间步,请替换为NaN 价值观

这些步骤应该允许您最终得到一个包含数据的数组,该数组包含您没有信息的缺失值。当前,您使用的数据数组是数据大小减去缺少的值。您需要使用数据长度加上缺少的时间步长初始化数组。我还建议您在没有信息的情况下使用
NaN
numpy.NaN
)值,因为使用零值会影响您可能希望对数据进行的统计。一旦将数据正确存储在阵列中,就可以使用这个强大的库来分析时间序列

正如现有答案所暗示的,如果您可以重写代码,使其不依赖于您的文件和数据,您将获得更好的响应。这样,提供答案的人就可以复制您的代码并在本地运行。调用文件名
data
并使用属性
data
是很危险的。调用传入文件
ncfile
怎么样?然后从
ncfile
中提取变量,例如
precip=ncfile.variables['precip'][:]
。我想我正在创建一个包含所有仪表的数组(如果它们都出现在第一个文件中),方法是使用:#初始化时间序列存储数据类型=zip(仪表id列表,['float32']*ngauges)timeseries\u per\u station=np.empty((ntimesteps,))timeseries\u per\u station.fill(np.nan)timeseries\u per\u station=timeseries\u per\u station.astype(dtypes)问题是,我需要确定哪个量表缺少数据,如果超过一个量表,我认为这很棘手??