如何用Python从NetCDF文件中提取一个变量的所有值?
我正在尝试使用CHESS-SCAPE数据集(可以在这里找到 - https://data.ceda.ac.uk/badc/deposited2021/chess-scape/data/rcp60/01/monthly)来获取1980到2080年间英国的地表风速数据,使用Python编程。理想情况下,我希望能得到每个网格点的每月风速数据。
这个文件是NetCDF格式的,我在使用它时遇到了很大的困难。我尝试了很多方法,但为了让这个问题简单明了,我将展示我用Python访问数据的一部分代码:
import pandas as pd
import numpy as np
import xarray as xr
data = xr.open_dataset('chess-scape.nc', chunks={})
wind_speed = data['sfcWind']
df = pd.DataFrame(wind_speed.isel(time=1199).values)
df.to_csv('windspeed.csv')
data.close()
结果在生成的csv文件中似乎是一些随机的、零散的数值,所以我猜我没有正确访问数据。我还尝试直接访问这些数值,如下所示:
df = pd.DataFrame(wind_speed.values[1199])
但我觉得在这个过程中,整个数据集都被加载到内存中,所以内存很快就满了。以下是生成的CSV文件的一个例子:
我目前正在使用一个已有的数据集,它是一个.dat文件,我有点不知道如何从这个NetCDF文件中提取数据,使其看起来像这个文件:
我意识到这个问题可能表述得不好,甚至可能是个错误的问题,所以如果能给我一些方向,我将非常感激。
1 个回答
你的方法没有问题。可能让你困惑的是,实际的数据(英国的风速)周围有很多空白的网格点(海洋上没有数据)。如果你把生成的CSV文件加载到LibreOffice Calc(或Excel)中,然后尽量缩小视图,你会发现英国的形状是倒过来的(泰晤士河的入海口大约在单元格VL 182附近)。
使用xarray,你可以在像Jupyter Lab这样的交互环境中,使用 wind_speed.isel(time=1199).plot()
来直观检查提取的数据是否符合预期。(如果你的Python环境不是交互式的,你还需要 import matplotlib.pyplot as plt
和 plt.show()
。)
所以,也许问题应该是:你真的需要把数据保存为CSV格式吗?根据我的经验,使用xarray处理NetCDF数据是最方便的,所以我不会尝试转换它,除非是为了可视化的目的。
顺便提一下,我建议你这样写代码(少了几个字符):
import numpy as np
import xarray as xr
import pandas as pd
ds = xr.open_dataset('chess-scape.nc')
wind_speed = ds.sfcWind
df = pd.DataFrame(wind_speed.isel(time=1199))
df.to_csv('windspeed.csv')