将netCDF文件导入Pandas数据框架

44

圣诞快乐! 我对Python和Pandas还很陌生,所以任何帮助都将不胜感激。 我试图读取一个netCDF文件,这是可以做到的,然后将其导入Pandas Dataframe。该netcDF文件是2D的,因此我只想“倾倒它”。 我尝试了DataFrame方法,但它无法识别对象。 可能我需要将netCDF对象转换为2D numpy数组? 再次感谢任何有关如何最好执行此操作的建议。

3个回答

58

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

import xarray as xr

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

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


20

如果你的NetCDF文件(或OPeNDAP数据集)遵循CF Metadata约定,你可以使用NetCDF4-Python包来利用它们,在Pandas中轻松访问它们。(我正在使用包含Pandas和NetCDF4-Python的Enthought Python Distribution)。

在下面的示例中,NetCDF文件通过OPeNDAP提供服务,NetCDF4-Python库让你像本地NetCDF文件一样打开和处理远程OPeNDAP数据集,这相当不错。如果你想查看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/


4
您可以使用像PyNIO这样的库将文件读入p.e.数组中,并将它们馈送给pandas。
PyNIO允许读取多种文件格式,包括经典的netCDF3和netCDF4。
netcdf4-python也可以读取这些netCDF格式,并且与py3.3兼容。

如何将一个grib对象保存为.grib扩展名的文件?(grib对象位于jupyter笔记本上) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接