Импорт файла netCDF в фрейм данных Pandas

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

3 ответа

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

import xarray as xr

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

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

Если ваш файл NetCDF (или OPeNDAP набор данных) следует соглашениям CF Metadata, вы можете использовать их с помощью NetCDF4-Python package, что делает доступ к ним в Пандах действительно простым. (Я использую 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/

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

Другие вопросы по тегам