我正在尝试创建一个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都会导致相同的错误。
你可以帮帮我吗? 谢谢。答案 0 :(得分:0)
问题在于你如何指定:
newvar.FillValue = "-32767"
newvar.scale_factor = "0.00137038771743"
newvar.add_offset = "238.393472216"
newvar.missing_value = "-32767"
scale_factor
和add_offset
应该是数字值,而不是字符串。 FillValue
和missing_value
可以是字符串(至少在我的小测试中),但您可能也希望将它们设为数字。
来自文档:
当数据写入变量时,使用::
打包data =(data - self.add_offset)/self.scale_factor
这是错误的来源,例如:
np.array(1.)-'string'
导致完全相同的错误。