2017-11-20 11 views
0

netcdfファイルを作成しようとしています。最初のステップでは、netcdfファイルからデータを読み込んで新しいnetcfdファイルに書き込むだけです.dtype float64と3次元(時間、緯度、経度)を持つデータ配列があります。netcdfファイルを作成するときのタイプエラー

私はスクリプトを実行すると、私は次のエラーを取得する:

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として作成すると、同じエラーが発生します。

ここでお手伝いできますか? ありがとうございます。

+0

2メートルの温度が整数であることが奇妙に見えます。しかし、どういうわけか、完全なトレースを追加してください。少なくとも、どの行が 'TypeError'になるかを記述してください。これまでのところ、あなたのコードには何も間違いはありません。通常、Numpy/NetCDF4は物事を正しいデータ型に変換するのに非常に柔軟です。 – Bart

答えて

0

問題は、ユーザーが指定する方法である:

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

scale_factoradd_offsetは数値ではなく文字列でなければなりません。 FillValuemissing_valueは文字列(少なくとも私の小さなテストでは)でもかまいませんが、おそらく数値にすることもできます。

ドキュメントから:

When data is written to a variable it is packed using::

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

エラーとは、例えば、どこから来るかです:あなたが得るとまったく同じエラーで

np.array(1.)-'string' 

結果。

+0

ありがとうございます。それが問題を解決しました! :-) –