2017-11-20 2 views
0

netcdf 파일을 만들려고합니다. 첫 번째 단계에서 원하는 것은 netcdf 파일의 데이터를 읽고 새로운 netcfd 파일에 작성하는 것입니다.이 데이터 배열은 dtype float64 및 3 차원 (시간, 위도, 경도)을 갖습니다. 나는 다음과 같은 오류가 스크립트를 실행하면netcdf 파일을 만들 때 TypeError가 발생했습니다.

:

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

감사합니다. 그게 문제를 해결했습니다! :-) –

관련 문제