2012-12-26 18 views
11

Buon Natale. Sono ancora molto nuovo per Python e Pandas quindi l'aiuto è apprezzato.
Sto cercando di leggere in un file netCDF, cosa che posso fare e quindi importarlo in un Dataframe di Pandas. Il file netcDF è 2D, quindi voglio solo "scaricarlo". Ho provato il metodo DataFrame ma non riconosce l'oggetto. Presumibilmente ho bisogno di convertire l'oggetto netCDF in una matrice numpy 2D? Ancora grazie per le idee sul modo migliore per farlo. I migliori auguri JasonImporta il file netCDF in Pandas dataframe

risposta

2

È possibile utilizzare una libreria come PyNIO per leggere il file in p.e. matrici insipide e dar loro da mangiare ai panda.
PyNIO consente di leggere diversi formati di file, inclusi i classici netCDF3 e netCDF4.
netcdf4-python può anche leggere questi formati netCDF ed è compatibile py3.3

11

Se il file NetCDF (o OPeNDAP set di dati) segue le convenzioni CF metadati si può approfittare di loro utilizzando la NetCDF4-Python package, che li rende l'accesso a Pandas davvero facile. (Sto usando l'Enthought Python Distribution che include sia Pandas che NetCDF4-Python).

Nell'esempio seguente, il file NetCDF viene servito tramite OPeNDAP e la libreria NetCDF4-Python consente di aprire e utilizzare un set di dati OPeNDAP remoto come se fosse un file NetCDF locale, che è piuttosto fluido. Se volete vedere gli attributi del file NetCDF4, puntare il browser a questo link http://geoport-dev.whoi.edu/thredds/dodsC/HUDSON_SVALLEY/5951adc-a1h.nc.html

Si dovrebbe essere in grado di eseguire questo senza modifiche:

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) 

Il risultato può essere vista qui nel notebook ipython : http://nbviewer.ipython.org/4615153/

13

La libreria xarray gestisce i dati netCDF arbitrari-dimensionali e conserva i metadati. Xarray fornisce un semplice metodo di apertura dei file netCDF, e convertirli in panda dataframes:

import xarray as xr 

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

Ciò creerà una dataframe con un multi-indice con tutte le dimensioni in esso. Sfortunatamente, Pandas non supporta i metadati arbitrari, quindi andrà perso nella conversione, ma puoi mantenere lo ds in giro e usare i metadati da quello.

+1

xray è ora xarray: http://xarray.pydata.org/en/stable/ –

+2

Grazie @DaveX, aggiornato. – naught101