如何用Python从NetCDF文件中提取一个变量的所有值?

-1 投票
1 回答
33 浏览
提问于 2025-04-13 19:43

我正在尝试使用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文件的一个例子:

CSV输出

我目前正在使用一个已有的数据集,它是一个.dat文件,我有点不知道如何从这个NetCDF文件中提取数据,使其看起来像这个文件:

.dat文件数据集

我意识到这个问题可能表述得不好,甚至可能是个错误的问题,所以如果能给我一些方向,我将非常感激。

1 个回答

-1

你的方法没有问题。可能让你困惑的是,实际的数据(英国的风速)周围有很多空白的网格点(海洋上没有数据)。如果你把生成的CSV文件加载到LibreOffice Calc(或Excel)中,然后尽量缩小视图,你会发现英国的形状是倒过来的(泰晤士河的入海口大约在单元格VL 182附近)。

使用xarray,你可以在像Jupyter Lab这样的交互环境中,使用 wind_speed.isel(time=1199).plot() 来直观检查提取的数据是否符合预期。(如果你的Python环境不是交互式的,你还需要 import matplotlib.pyplot as pltplt.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')

撰写回答