使用另一个 netcdf 文件在 netcdf 文件中填充 nan 值
Fill nan values in a netcdf file using another netcdf file
我试图通过从另一个 NetCDf 文件('Source' 文件)获取值来填充 NetCDF 文件(我们称之为 'Target' 文件)中的 nan 值。 [可以从这里 下载这两个示例文件]
我正考虑在 python 中使用以下框架执行此操作:
Step1- identifying the nan values in the Target file, and extracting
the location (lat/long), storing in a dataframe
Step2- Extracting the corresponding values of the stored lat/long from
the Source file
Step3- writing these values into the Target file
我想出了以下代码:
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 文件具有不同的空间分辨率(尺寸)。
您可以为此使用 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)
我试图通过从另一个 NetCDf 文件('Source' 文件)获取值来填充 NetCDF 文件(我们称之为 'Target' 文件)中的 nan 值。 [可以从这里 下载这两个示例文件] 我正考虑在 python 中使用以下框架执行此操作:
Step1- identifying the nan values in the Target file, and extracting the location (lat/long), storing in a dataframe
Step2- Extracting the corresponding values of the stored lat/long from the Source file
Step3- writing these values into the Target file
我想出了以下代码:
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 文件具有不同的空间分辨率(尺寸)。
您可以为此使用 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)