Импортировать файл netCDF в Pandas dataframe

С Рождеством. Я все еще очень новичок в Python и Pandas, поэтому помощь приветствуется. Я пытаюсь прочитать в файле netCDF, который я могу сделать, а затем импортировать в Pandas Dataframe. Файл netcDF - 2D, поэтому я просто хочу "свалить его". Я пробовал метод DataFrame, но он не распознает объект. Предположительно мне нужно преобразовать объект netCDF в массив 2D numpy? Еще раз спасибо за любые идеи о том, как это сделать. С наилучшими пожеланиями Джейсон

Ответ 1

Библиотека xarray обрабатывает произвольные данные netCDF и сохраняет метаданные. Xarray предоставляет простой способ открытия netCDF файлов и преобразования их в pandas dataframes:

import xarray as xr

ds = xr.open_dataset('/path/to/netcdf')
df = ds.to_dataframe()

Это создаст фрейм данных с мультииндексисом со всеми измерениями в нем. К сожалению, pandas не поддерживает произвольные метаданные, поэтому они будут потеряны при преобразовании, но вы можете сохранить ds вокруг и использовать метаданные из этого.

Ответ 2

Если ваш файл NetCDF (или OPeNDAP dataset) следует соглашениям CF Metadata, которые вы можете использовать в них, используя NetCDF4-Python package, что делает доступ к ним в Pandas очень простым. (Я использую Enthought Python Distribution, которое включает как Pandas, так и NetCDF4-Python).

В приведенном ниже примере файл NetCDF обслуживается через OPeNDAP, а библиотека NetCDF4-Python позволяет открывать и работать с удаленным набором данных OPeNDAP так же, как если бы это был локальный файл NetCDF, который был довольно гладким. Если вы хотите увидеть атрибуты файла NetCDF4, укажите ваш браузер по этой ссылке http://geoport-dev.whoi.edu/thredds/dodsC/HUDSON_SVALLEY/5951adc-a1h.nc.html

Вы можете запустить это без изменений:

from matplotlib import pyplot as plt
import pandas as pd
import netCDF4

url='http://geoport-dev.whoi.edu/thredds/dodsC/HUDSON_SVALLEY/5951adc-a1h.nc'
vname = 'Tx_1211'
station = 0

nc = netCDF4.Dataset(url)
h = nc.variables[vname]
times = nc.variables['time']
jd = netCDF4.num2date(times[:],times.units)
hs = pd.Series(h[:,station],index=jd)

fig = plt.figure(figsize=(12,4))
ax = fig.add_subplot(111)
hs.plot(ax=ax,title='%s at %s' % (h.long_name,nc.id))
ax.set_ylabel(h.units)

Результат можно увидеть здесь в ноутбуке Ipython: http://nbviewer.ipython.org/4615153/

Ответ 3

Вы можете использовать библиотеку PyNIO для чтения вашего файла в p.e. numpy массивов и доведите их до pandas.
PyNIO позволяет читать несколько форматов файлов, включая классические netCDF3 и netCDF4.
netcdf4-python также может читать эти форматы netCDF и совместим с py3.3