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

问题描述 投票:0回答:1

我正在尝试使用 CHESS-SCAPE 数据集(在这里找到 - https://data.ceda.ac.uk/badc/deposited2021/chess-scape/data/rcp60/01/monthly)来获取地面风使用 Python 在整个日期范围(1980-2080)内提高英国的速度。理想情况下,我想要每个网格点的每月速度数据。

该文件是一个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])

但我认为在这个过程中整个数据集都被加载到内存中,因此 RAM 很快就会填满。生成的 CSV 文件示例:

CSV output

我目前正在使用一个现有的数据集,它是一个 .dat 文件,我对如何从这个 NetCDF 获取数据以使其看起来像这个文件有点不知所措:

.dat file dataset

我意识到这个问题的措辞可能很糟糕,而且可能确实是错误的问题,所以此时任何方向将不胜感激。

python pandas numpy python-xarray netcdf
1个回答
0
投票

你的方法没有任何问题。 我想,这种混乱来自于实际数据(英国上空的风速)被许多空网格点(海洋上空没有数据)包围。 如果将生成的 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')
© www.soinside.com 2019 - 2024. All rights reserved.