Импорт файла 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