#python #python-3.x #numpy #python-xarray #netcdf4
Вопрос:
Я пытаюсь загрузить NetCDF в фрейм данных либо с помощью xarray, либо с помощью библиотеки netCDF4. Обычно это не было бы проблемой, так как мои netCDFs по большей части содержат значения широты, долготы и данных в Float32. Я предполагаю, что моя ошибка заключается в том, что у меня есть некоторые типы данных, которые доставляются как Float64.
В настоящее время я получаю одну и ту же ошибку от обеих библиотек при загрузке, предположительно, потому, что они оба используют numpy. Я не занимаюсь никакой математикой — просто загружаю.
numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'multiply' output from dtype('<U32')
to dtype('float32') with casting rule 'same_kind'
использование печати(netCDF4.Dataset(«d:netdcdf.nc») дает следующее описание:
dimensions(sizes): time(1), lon(841), lat(681)
variables(dimensions): float64 time(time), float64 lon(lon),
float64 lat(lat), int32 crs(), float32 deadpool(time, lat, lon)
Мой сценарий приведен ниже и включает в себя примеры загрузки как для xarray, так и для netCDF4.
#This file is designed to convert netcdf files to the BOM standard format.
import netCDF4
import pandas as pd
import xarray as xr
def main():
pass
if __name__ == '__main__':
inputfile = 'D:\Temp\WeatherDownloads\Weather\deadpool.aus.nc'
#xarray setup, debug and load
ncx = xr.open_dataset(inputfile)
ncdf = ncx.deadpool.to_dataframe() #fails here if we use xarray
print(ncdf.head(10))
#NetCDF4 setup, debug and load
nc = netCDF4.Dataset(inputfile, mode='r')
nc.variables.keys()
lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time = nc.variables['time']
datavar = nc.variables['deadpool'][:] #fails here if we use netCDF4
print("The dtype of lat is: " str(dtype(lat)))
print("The dtype of lon is: " str(dtype(lon)))
print("The dtype of time is: " str(dtype(time)))
print("The dtype of datavar is: " str(dtype(datavar)))
data_ts = pd.Series(datavar, index=time)
print(data_ts.head(10))
Комментарии:
1. «U32» — это строка в юникоде
2. Второй раз за сегодняшний день вы указали на то, что я совершенно упустил. Отличная работа. У вас есть стратегия, как я могу определить, какая переменная может рассматриваться как U32? Когда я смотрю на вывод печати(r) для NetCDF, все выглядит так, как будто оно должно быть числовым.
3. Для массивов numpy
arr.dtype
говорит нам. Такжеprint(repr(arr))
дает больше информации, чем обычная печать.4. Для всех, кто может обнаружить это в будущем — я не смог решить эту проблему, и я также не смог определить, почему это происходит. Вместо этого я установил GDAL для Python (файл колеса, а не исполняемую среду Windows), используя один лайнер для преобразования альтернативного типа файла (ERDAS IMAGINE) в netcdf, а затем использовал xarray для добавления измерения времени, установки метаданных и переименования измерений и переменных по мере необходимости. Это усилие составляло, может быть, 10-15 строк и было довольно простым. GDAL был ключом к тому, чтобы перевод работал, поскольку он включает исправления ошибок и т.д.