使用Python将NetCDF文件转换为CSV或文本

8
我正在尝试使用Python将netCDF文件转换为CSV或文本文件。我已经阅读了this post,但我仍然缺少一步(我是Python的新手)。这是一个包括纬度、经度、时间和降水数据的数据集。
以下是我的代码:
import netCDF4
import pandas as pd

precip_nc_file = 'file_path'
nc = netCDF4.Dataset(precip_nc_file, mode='r')

nc.variables.keys()

lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
precip = nc.variables['precip'][:]

我不确定如何继续,但我知道这涉及使用pandas创建数据帧。

4个回答

16

我认为 pandas.Series 对于您创建带有时间,纬度,经度和降水量的 CSV 文件应该是可用的。

import netCDF4
import pandas as pd

precip_nc_file = 'file_path'
nc = netCDF4.Dataset(precip_nc_file, mode='r')

nc.variables.keys()

lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
precip = nc.variables['precip'][:]

# a pandas.Series designed for time series of a 2D lat,lon grid
precip_ts = pd.Series(precip, index=dtime) 

precip_ts.to_csv('precip.csv',index=True, header=True)

谢谢!这很完美。 - aliki43
2
不用谢。为了未来的读者,您应该接受这个答案。 - Eric Bridger
1
它给了我 ValueError: Data must be 1-dimensional。这行代码是 pd.Series(precip, index=dtime) - Atreyagaurav
基于Pandas文档 -> pandas.Series是带有轴标签(包括时间序列)的一维ndarray。这就是为什么它会引发ValueError的原因。替代方案是使用pandas.DataFrame。 - muchtarsp

7
import xarray as xr

nc = xr.open_dataset('file_path')
nc.precip.to_dataframe().to_csv('precip.csv')

你能否提供更多关于为什么写这段代码而不是回答问题的清晰解释?这段代码如何回答这个问题? - denis_lor
1
流行的答案对我没用。我不确定为什么(可能是我做错了什么?)。似乎xarray库提供了更少的代码行数来解决问题。这个替代方案可能会为一些人节省时间,就像我一样。 - Robert Davy
关于另一个没有起作用的答案。我在标准的NOAA mslp netCDF文件上尝试了它,https://www.esrl.noaa.gov/psd/thredds/fileServer/Datasets/ncep.reanalysis2/surface/mslp.2018.nc,并在倒数第二行获得了以下错误: - Robert Davy

一个专为2D纬度和经度网格的时间序列设计的pandas.Series

... precip_ts = pd.Series(precip, index=dtime) Traceback (most recent call last): File "<stdin>", line 2, in <module> File "C:\Users\dav500\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\series.py", line 262, in init raise_cast_failure=True) File "C:\Users\dav500\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\internals\construction.py", line 658, in sanitize_array raise Exception('Data must be 1-dimensional') Exception: 数据必须是一维的
- Robert Davy
非常感谢,这对我非常完美地起作用了!我已经苦苦挣扎了好几天,但是你救了我! - Jane Kathambi

2

根据您的需求,您可以使用Numpy的savetxt方法:

import numpy as np

np.savetxt('lat.csv', lat, delimiter=',')
np.savetxt('lon.csv', lon, delimiter=',')
np.savetxt('precip.csv', precip, delimiter=',')

这将输出数据,没有任何标题或索引列。

如果您需要这些功能,可以构建一个DataFrame,并将其保存为CSV文件,如下所示:

df_lat = pd.DataFrame(data=lat, index=dtime)
df_lat.to_csv('lat.csv')

# and the same for `lon` and `precip`.

注意:这里我假设日期/时间索引沿着数据的第一维运行。

谢谢!不幸的是,这个方法没有起作用 - 我决定只提取我在其他数据集中使用的所有纬度和经度,并循环遍历每个地点的时间序列。就像我上面提供的链接一样。虽然比较耗时,但它能够正常工作! - aliki43

0

xarray库的替代方案:

import netCDF4
precip_nc_file = r'file_path\file_name.nc'
nc = netCDF4.Dataset(precip_nc_file, mode='r')
cols = list(nc.variables.keys())
list_nc = []
for c in cols:
    list_nc.append(list(nc.variables[c][:]))
df_nc = pd.DataFrame(list_nc)
df_nc = df_nc.T
df_nc.columns = cols
df_nc.to_csv("file_path.csv", index = False)

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