我有一个相对重力数据集,在纬度和经度点上进行了697次测量。我在转换到Xarray数据集时遇到了困难,这样我就可以不可避免地用Xarray.interp_like创建一个内插网格。
我尝试使用以下文章从一个系列和一个Dataframe创建DataArray:https://towardsdatascience.com/basic-data-structures-of-xarray-80bab8094efa
使用级数方法:
idx = pd.MultiIndex.from_arrays(arrays=[lat_grav,long_grav],names=["lat","lon"])
s = pd.Series(data=rel_grav,index=idx)
s
lat lon
36.713923 -116.120574 NaN
-116.120574 NaN
-116.120574 NaN
36.712458 -116.125034 NaN
-116.125034 NaN
..
36.703896 -116.116244 NaN
-116.116244 NaN
36.725249 -116.124976 NaN
-116.124976 NaN
-116.124976 NaN相对重力测量仍然是NaNs,所以我决定使用DataFrame方法:
rel_grav_df = pd.DataFrame({"relativegrav":rel_grav,"lat":lat_grav,"lon":lon_grav})
rel_grav_df = rel_grav_df.reset_index(drop = True)
rel_grav_df
relativegrav lat lon
0 979517.368887 36.713923 -116.120574
1 979517.369767 36.713923 -116.120574
2 979517.370685 36.713923 -116.120574
3 979519.096209 36.712458 -116.125034试图在示例中将表枢轴,我使用了以下代码并获得了错误:
df_pv = rel_grav_df.pivot(index="lat",columns="lon")
Index contains duplicate entries, cannot reshape这就是我最初尝试reset_index的原因,但这两种方法都不起作用。对于最后的结果,我想使用以下代码将重力插值到与地形网格相同的大小:
gravity_interp = gravity.interp_like(topography,kwargs={"fill_value":None})任何帮助都将不胜感激!下面是编辑后的,我在数据中找到了重复的,下面是更新的数据:
rel_grav_df = pd.DataFrame({"relativegrav":rel_grav,"lat":lat_grav,"lon":long_grav})
rel_grav_df = rel_grav_df.drop_duplicates(subset=['lat'])
rel_grav_df = rel_grav_df.reset_index(drop = True)
rel_grav_df.to_csv(r'rel_grav_data.txt',sep=' ', mode = 'a')对于如下所示的数据:
relativegrav lat lon
0 979517.3688865899 36.7139233 -116.1205735
1 979519.096208526 36.7124585 -116.1250345
2 979518.8915050578 36.71282822 -116.1316972
3 979531.2591178748 36.70126449 -116.1439218
4 979526.3018131296 36.70558774 -116.1420382
5 979524.8843729249 36.70548686 -116.1359999
6 979521.9290486736 36.70901614 -116.1335681
7 979514.2801810974 36.71966692 -116.1100001
8 979528.4878656694 36.72797377 -116.0854069
9 979521.5282591976 36.72430037 -116.0944469
10 979517.7510474161 36.72091093 -116.1030826
11 979515.6928347832 36.7191884 -116.1074014
12 979516.3006383271 36.71579345 -116.1160991现在创建DataArray:
df_pv = rel_grav_df.pivot(index="lat",columns="lon")
df_pv = df_pv.droplevel(0,axis=1)
da = xr.DataArray(data = df_pv)
da
xarray.DataArraylat: 212lon: 212
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]])
Coordinates:
lat
(lat)
float64
36.69 36.69 36.69 ... 36.76 36.76
lon
(lon)
float64
-116.1 -116.1 ... -116.1 -116.1由于某些原因,重力值仍未填充DataArray。
发布于 2022-11-11 18:49:27
在2D中的点态数据和常规的2D网格上的数据之间有一个重要的区别。虽然您可以在xarray中存储和处理点态数据,但xarray的空间操作将不像您预期的那样工作。相反,xarray将把唯一的索引维度"point“作为数据集的唯一维度。所以你的计划,正如你所概述的,是行不通的。
相反,如果您的目标是将数据内插到常规的2D网格上,那么在进入xarray之前,您需要自己进行这种插值。因此,scipy.interpolate是一个很好的地方。我在这里实现了一个快速的最近邻插值--如果你愿意的话,你可以做一些更复杂的事情:
In [18]: interpolator = scipy.interpolate.NearestNDInterpolator(
...: df[['lon', 'lat']].values, df['relativegrav'].values
...: )
In [19]: # define your target grid however you'd like
...: y = np.linspace(36.7, 36.73, 100)
...: x = np.linspace(-116.2, -116, 200)
...: # broadcast these against eachother to get every combo of x, y points
...: xx, yy = np.meshgrid(x, y)
...:
...: values = interpolator(xx.flat, yy.flat).reshape(xx.shape)
In [20]: filled = xr.DataArray(values, dims=['lat', 'lon'], coords=[y, x])现在,您可以在一个完整的2D规则网格上获得数据:
In [23]: filled
Out[23]:
<xarray.DataArray (lat: 100, lon: 200)>
array([[979531.25911787, 979531.25911787, 979531.25911787, ...,
979528.48786567, 979528.48786567, 979528.48786567],
[979531.25911787, 979531.25911787, 979531.25911787, ...,
979528.48786567, 979528.48786567, 979528.48786567],
[979531.25911787, 979531.25911787, 979531.25911787, ...,
979528.48786567, 979528.48786567, 979528.48786567],
...,
[979526.30181313, 979526.30181313, 979526.30181313, ...,
979528.48786567, 979528.48786567, 979528.48786567],
[979526.30181313, 979526.30181313, 979526.30181313, ...,
979528.48786567, 979528.48786567, 979528.48786567],
[979526.30181313, 979526.30181313, 979526.30181313, ...,
979528.48786567, 979528.48786567, 979528.48786567]])
Coordinates:
* lat (lat) float64 36.7 36.7 36.7 36.7 36.7 ... 36.73 36.73 36.73 36.73
* lon (lon) float64 -116.2 -116.2 -116.2 -116.2 ... -116.0 -116.0 -116.0https://stackoverflow.com/questions/74383791
复制相似问题