创建netcdf文件时出现TypeError

时间:2017-11-20 14:55:07

标签: python numpy typeerror netcdf

我正在尝试创建一个netcdf文件。在第一步中我想要的是从netcdf文件中读取数据并将其写入新的netcfd文件中我有一个数据数组,其中包含dtype float64和三维(时间,纬度,经度)。

当我运行脚本时,我收到以下错误:

  

TypeError:ufunc'sundract'不包含带签名匹配的循环   类型dtype('U32')dtype('U32')dtype('U32')

据我所知,数据类型不匹配。但我不知道问题出在哪里。

fid = Dataset(Dir, "r")
t2m = np.array(fid.variables["t2m"])

#create new netcdf file
new_file = "ERA_t2m_2011to2017"
dataset = Dataset(new_file, "w", format="NETCDF3_64BIT_OFFSET")

#create dimensions
longitude = dataset.createDimension("longitude", 1200)
latitude = dataset.createDimension("latitude", 101)
time = dataset.createDimension("time", None)

#create variables
newvar = dataset.createVariable("longitude", np.float32, ("longitude"))
newvar.long_name = "longitude"
newvar.units = "degrees_east"
newvar.axis = "longitude-axis"
newvar[:] = np.array(fid.variables["longitude"])

newvar = dataset.createVariable("latitude", np.float32, ("latitude"))
newvar.long_name = "latitude"
newvar.units = "degrees_north"
newvar.axis = "latitude-axis"
newvar[:] = np.array(fid.variables["latitude"])

newvar = dataset.createVariable("time", np.int32, ("time"))
newvar.long_name = "time"
newvar.units = "hours since 1900-01-01 00:00:0.0"
newvar.calendar = "gregorian"
newvar.axis = "time-axis"
newvar[:] = np.array(fid.variables["time"])

newvar = dataset.createVariable("t2m", np.float64, ("time", "latitude", "longitude"))
newvar.long_name = "2 meter temperature"
newvar.units = "K"
newvar.FillValue = "-32767"
newvar.scale_factor = "0.00137038771743"
newvar.add_offset = "238.393472216"
newvar.missing_value = "-32767"
newvar[:] = t2m

也许一个重要的信息也是,

fid.variables["t2m"]

产生以下输出:

  

class'netCDF4._netCDF4.Variable'

     

int16 t2m(时间,纬度,经度)

     

scale_factor:0.00135205961432

     

add_offset:238.864955074

     

_FillValue:-32767

     

missing_value:-32767

     

单位:K

     

long_name:2米温度

     

无限维度:时间   当前形状=(2920,101,1200)   填写

所以2tm变量最初似乎是dtype int32,但是当我读入它时它变成了float64。 但是,将变量2tm创建为float64或int32都会导致相同的错误。

你可以帮帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于你如何指定:

newvar.FillValue = "-32767"
newvar.scale_factor = "0.00137038771743"
newvar.add_offset = "238.393472216"
newvar.missing_value = "-32767"

scale_factoradd_offset应该是数字值,而不是字符串。 FillValuemissing_value可以是字符串(至少在我的小测试中),但您可能也希望将它们设为数字。

来自文档:

  

当数据写入变量时,使用::

打包      

data =(data - self.add_offset)/self.scale_factor

这是错误的来源,例如:

np.array(1.)-'string'

导致完全相同的错误。