使用另一个netcdf文件将nan值填充到netcdf文件中

时间:2019-11-19 00:05:05

标签: python netcdf python-xarray nco cdo

我试图通过从另一个NetCDf文件(“源”文件)中获取值来填充NetCDF文件中的nan值(我们称之为“目标”文件)。 [这两个示例文件可以下载from here] ,我当时正在考虑使用以下框架在python中进行此操作:

  

Step1-识别目标文件中的nan值,然后提取   位置(经度/纬度),存储在数据框中

     

Step2-从中提取存储的经/纬度的相应值   源文件

     

Step3-将这些值写入目标文件

我想到了以下代码:

import pandas as pd
import xarray as xr
import numpy as np

Source = xr.open_dataset("Source.nc")
Target = xr.open_dataset("Target.nc")

#Step 1 
df = Target.to_dataframe()
df=df.reset_index()
df2=(df.loc[df['ET'].isin([32767,'nan'])])


#Step2
lat = df2["lat"]
lon = df2["lon"]
point_list = zip(lat,lon)

Newdf = pd.DataFrame([])

for i, j in point_list:
    dsloc = Source.sel(lat=i,lon=j,method='nearest')
    DT=dsloc.to_dataframe()
    Newdf=Newdf.append(DT,sort=True)

存在三个问题: 1-我不知道该怎么做第三步

2-第二步需要花很长时间才能完成,因为可能还有很多遗漏点

3-这只是一步!使用这两个文件。

因此,我相信在python或cdo / Nco中可能会有更好的方法,更容易,更快地执行此操作… 欢迎任何想法和解决方案……谢谢…… 请注意,两个NC文件的空间分辨率(尺寸)不同。

1 个答案:

答案 0 :(得分:2)

您可以使用Xarray's where method。如果您完全关心效率,那么您真的想远离python for循环。这是一个如何工作的示例:

# these are the points you want to keep
# you can fine tune this further (exclude values over a threshold)
condition = target.notnull()

# fill the values where condition is false
target_filled = target.where(condition, source)