当前位置: 首页 > 知识库问答 >
问题:

从NETCDF文件中提取数据的有效方法

周培
2023-03-14

我有许多坐标(大约20000),我需要从许多NetCDF文件中提取数据,每个文件大约有30000个时间步(未来的气候场景)。使用这里的解决方案效率不高,原因是每个i,j将“dsloc”转换为“dataframe”所花费的时间(请看下面的代码)。**可以从这里下载NetCDF文件示例**

import pandas as pd
import xarray as xr
import time

#Generate some coordinates
coords_data = [{'lat': 68.04, 'lon': 15.20, 'stid':1},
    {'lat':67.96, 'lon': 14.95, 'stid': 2}]
crd= pd.DataFrame(coords_data)
lat = crd["lat"]
lon = crd["lon"]
stid=crd["stid"]

NC = xr.open_dataset(nc_file)
point_list = zip(lat,lon,stid)
start_time = time.time()
for i,j,id in point_list:
    print(i,j)
    dsloc = NC.sel(lat=i,lon=j,method='nearest')
    print("--- %s seconds ---" % (time.time() - start_time))
    DT=dsloc.to_dataframe()
    DT.insert(loc=0,column="station",value=id)
    DT.reset_index(inplace=True)
    temp=temp.append(DT,sort=True)
    print("--- %s seconds ---" % (time.time() - start_time))

结果是:

68.04 15.2
--- 0.005853414535522461 seconds ---
--- 9.02660846710205 seconds ---
67.96 14.95
--- 9.028568267822266 seconds ---
--- 16.429600715637207 seconds ---

这意味着每个i、j需要大约9秒来处理。考虑到大量的坐标和netcdf文件以及大量的时间步长,我想知道是否有一种python方式可以优化代码。我也可以使用CDO和NCO运营商,但我也发现了使用它们的类似问题。

共有2个答案

龚鸿雪
2023-03-14

我有一个潜在的解决方案。这个想法是首先将 xarray 数据数组转换为熊猫,然后根据纬度/纬度条件获取熊猫数据帧的子集。

# convert xarray data to a pandas dataframe
def xr_to_df(data):
    data = data.to_dataframe()
    data.reset_index(inplace=True)
    return data

# convert your xarray data to a pandas dataframe
full_df = xr_to_df(full_xarray)

# create a 2 columns pandas dataframe containing your target coordinates
points = pd.DataFrame({'lat':target_lat, 'lon':target_lon})

# get the values at your target points only via merging on the left
subset = pd.merge(points,full_df)

我不确定你的数据大小,这会有多快。但至少,这避免了循环。我想应该更快吗?

我注意到你的点是随机分布的(不在网格中心)。要解决这个问题,您可以首先编写自己的代码,将它们重新网格化到netcdf分辨率上,使用类似< code > NP . arg min(ABS(lat-lat _ netcdf))这样的工具来查找最近的纬度和经度。

宰父冠玉
2023-03-14

这是xarray使用DataArray索引进行高级索引的完美用例。

# Make the index on your coordinates DataFrame the station ID,
# then convert to a dataset.
# This results in a Dataset with two DataArrays, lat and lon, each
# of which are indexed by a single dimension, stid
crd_ix = crd.set_index('stid').to_xarray()

# now, select using the arrays, and the data will be re-oriented to have
# the data only for the desired pixels, indexed by 'stid'. The
# non-indexing coordinates lat and lon will be indexed by (stid) as well.
NC.sel(lon=crd_ix.lon, lat=crd_ix.lat, method='nearest')

数据中的其他维度将被忽略,因此如果原始数据具有维度< code>(lat,lon,z,time),则新数据将具有维度< code>(stid,z,time)。

 类似资料:
  • 我有一个大约350个坐标的列表,这些坐标是指定区域内的坐标,我想使用Xarray从netCDF文件中提取这些坐标。如果它是相关的,我试图从一个特定的地表模型中提取SWE(雪水当量)数据。 我的问题是这个 for 循环需要永远遍历列表中的每个项目并获取相关的时间序列数据。也许在某种程度上这是不可避免的,因为我必须从每个坐标的 netCDF 文件中实际加载数据。我需要帮助的是以任何可能的方式加速代码。

  • 我需要从全球网格中提取特定节点集的数据,这些节点由纬度/经度坐标给出(大约5000-10000)。这些数据是水力参数的时间序列,例如波高。 全球数据集是巨大的,所以它被分成许多NetCDF文件。每个NetCDF文件大约5GB,包含整个全球网格的数据,但只针对一个变量(例如波高)和一年(例如2020年)。假设我想在某个位置提取6个变量的完整时间序列(42年),我需要提取数据形式为6x42=252个N

  • 我有海洋pH、o2等的全球4D NetCDF文件。每个文件有1个变量和4个维度(时间、经度、纬度和深度)。我希望从不包含NA的每个单元格的最底部深度提取数据。我尝试使用带有负超实验室的NCO的nks: 但是,这只为我提供了最深的箱(即-5700米深度箱)的数据,输出了海洋中所有较浅区域的NaN。有没有办法以类似的方式提取数据,但指定我想要每个单元格最深的非 NaN 值? 我能够使用 R、CDO 或

  • 我有一个R代码,它从单个. nc4文件中提取每个月的每日值。我有49个netcdf文件。我想使用循环从所有这些文件中提取数据并将它们写入唯一的csv文件中。 我有一个文件的代码,但我需要多个文件的帮助。

  • 我有以下形状文件和 netcdf 文件。 我想从netcdf文件中提取包含在shapefile边界内的数据。 你对我如何做到这一点有什么建议吗? 形状文件对应于SREX区域11北欧(NEU),netcdf文件是CMIP6气候模型数据输出(UA变量)的示例。我想要的输出必须是 netcdf 格式。 更新 到目前为止,我尝试使用NCL和数位长创建一个netcdf掩码,并将此掩码应用于原始netcdf数

  • 我有netcdf数据,其中包含2020年的每日数据,以特定湿度为变量,以及一个excel文件,其中包含北印度洋上空形成的所有气旋的日期。大多数情况下,当我们想要提取特定时间范围内的数据时,我们习惯使用 xarray 进行切片,但在这种特定情况下,我面临的问题是我只需要提取 excel 文件中那些特定旋风日的数据并创建一个复合。如果有人可以通过展示如何做到这一点来帮助我,我们将不胜感激。我正在附加一