29

圣诞节快乐!我对 Python 和 Pandas 还是很陌生,因此非常感谢任何帮助。我正在尝试读取 netCDF 文件,我可以这样做,然后将其导入 Pandas Dataframe。netcDF 文件是 2D 的,所以我只想将其“转储”。我已经尝试过 DataFrame 方法,但它无法识别该对象。大概我需要将 netCDF 对象转换为 2D numpy 数组?再次感谢您提供有关执行此操作的最佳方法的任何想法。

4

3 回答 3

47

xarray库处理任意维度的 netCDF 数据,并保留元数据Xarray 提供了一种打开 netCDF 文件并将它们转换为 pandas 数据帧的简单方法:

import xarray as xr

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

这将创建一个具有多索引的数据框,其中包含所有维度。不幸的是,Pandas 不支持任意元数据,因此在转换过程中会丢失,但您可以保留ds周围,并使用其中的元数据。

于 2015-03-13T02:24:08.450 回答
17

如果您的 NetCDF 文件(或OPeNDAP数据集)遵循 CF 元数据约定,您可以通过使用它们来利用它们NetCDF4-Python package,这使得在 Pandas 中访问它们变得非常容易。(我正在使用包含 Pandas 和 NetCDF4-Python 的 Enthought 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 Notebook 中看到:http: //nbviewer.ipython.org/4615153/

于 2013-01-24T01:18:17.793 回答
2

您可以使用 PyNIO 之类的库将文件读入 pe numpy 数组并将它们提供给 pandas。
PyNIO允许读取多种文件格式,包括经典的 netCDF3 和 netCDF4。
netcdf4-python也可以读取这些 netCDF 格式并且兼容 py3.3

于 2012-12-26T08:05:10.480 回答