创建 netcdf 文件时出现 TypeError
TypeError when creating netcdf file
我正在尝试创建 netcdf 文件。在第一步中,我想要的是从 netcdf 文件中读取数据并将其写入新的 netcfd 文件中我有一个数据数组,它具有 dtype float64 和三个维度(时间、纬度、经度)。
当我 运行 脚本时,出现以下错误:
TypeError: ufunc 'subtract' did not contain a loop with signature matching
types 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(time, latitude, longitude)
scale_factor: 0.00135205961432
add_offset: 238.864955074
_FillValue: -32767
missing_value: -32767
units: K
long_name: 2 metre temperature
unlimited dimensions: time
current shape = (2920, 101, 1200)
filling off
所以2tm变量一开始好像是dtype int32,读进去后变成了float64。
但是,将变量 2tm 创建为 float64 或 int32 都会导致相同的错误。
你能帮帮我吗?
谢谢。
问题在于您指定的方式:
newvar.FillValue = "-32767"
newvar.scale_factor = "0.00137038771743"
newvar.add_offset = "238.393472216"
newvar.missing_value = "-32767"
scale_factor
和 add_offset
应该是数值,而不是字符串。 FillValue
和 missing_value
可以是字符串(至少在我的小测试中是这样),但您可能也希望将它们设为数字。
来自文档:
When data is written to a variable it is packed using::
data = (data - self.add_offset)/self.scale_factor
这是错误的来源,例如:
np.array(1.)-'string'
结果与您得到的错误完全相同。
我正在尝试创建 netcdf 文件。在第一步中,我想要的是从 netcdf 文件中读取数据并将其写入新的 netcfd 文件中我有一个数据数组,它具有 dtype float64 和三个维度(时间、纬度、经度)。
当我 运行 脚本时,出现以下错误:
TypeError: ufunc 'subtract' did not contain a loop with signature matching types 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(time, latitude, longitude)
scale_factor: 0.00135205961432
add_offset: 238.864955074
_FillValue: -32767
missing_value: -32767
units: K
long_name: 2 metre temperature
unlimited dimensions: time current shape = (2920, 101, 1200) filling off
所以2tm变量一开始好像是dtype int32,读进去后变成了float64。 但是,将变量 2tm 创建为 float64 或 int32 都会导致相同的错误。
你能帮帮我吗? 谢谢。
问题在于您指定的方式:
newvar.FillValue = "-32767"
newvar.scale_factor = "0.00137038771743"
newvar.add_offset = "238.393472216"
newvar.missing_value = "-32767"
scale_factor
和 add_offset
应该是数值,而不是字符串。 FillValue
和 missing_value
可以是字符串(至少在我的小测试中是这样),但您可能也希望将它们设为数字。
来自文档:
When data is written to a variable it is packed using::
data = (data - self.add_offset)/self.scale_factor
这是错误的来源,例如:
np.array(1.)-'string'
结果与您得到的错误完全相同。