Сейчас я работаю с данными GPM DPR. Я пытаюсь преобразовать данные нерегулярной полосы обзора в сетку 0,5°x0,5°, используя консервативный метод, чтобы сохранить общее количество осадков. Однако я читал, что для применения консервативного метода непосредственно на основе данных полосы вам необходимо точно знать границы каждого пикселя полосы. Поскольку они нерегулярные, я решил сначала перейти к сетке с разрешением, аналогичным исходным данным (0,05°x0,05°), используя «метод ближайшего соседа» с помощью Pyresample, а затем повысить масштаб до более крупной сетки.
Поскольку я использую метод ближайшего соседа для перехода к более мелкой сетке, я уже сталкиваюсь с проблемой неуверенности в сохранении общей массы, верно?
Если это так, что следует сделать? какой подход?
Это мой текущий код:
# ══════════════════════════════════════════════════════════════════
# 1. CONFIGURATION
# ══════════════════════════════════════════════════════════════════
lon_min, lon_max = -22.7, 47.0
lat_min, lat_max = 23.75, 61.0
src_res = 0.05 # pyresample fine grid resolution (degrees)
tgt_res = 0.5 # conservative target resolution (degrees)
target_date = "2025-07-15"
# ══════════════════════════════════════════════════════════════════
# 2. LOAD AND PREP DATAFRAME
# ══════════════════════════════════════════════════════════════════
ds_day = (
ds[['PrecipRateNearSurface', 'Latitude', 'Longitude', 'Time']]
.compute()
.to_dataframe()
.reset_index()
)
ds_day['date'] = pd.to_datetime(ds_day['Time']).dt.floor('D')
# ══════════════════════════════════════════════════════════════════
# 3. BUILD GRIDS AND REGRIDDER
# ══════════════════════════════════════════════════════════════════
# fine grid (pyresample output)
n_cols = int(round((lon_max - lon_min) / src_res))
n_rows = int(round((lat_max - lat_min) / src_res))
shape = (n_rows, n_cols)
area_def = AreaDefinition.from_extent(
'my_area', 'EPSG:4326', shape,
[lon_min, lat_min, lon_max, lat_max]
)
lons_f, lats_f = area_def.get_lonlats()
lon_centers_f = lons_f[0, :]
lat_centers_f = lats_f[:, 0]
half = src_res / 2
lon_edges_f = np.append(lon_centers_f - half, lon_centers_f[-1] + half)
lat_edges_f = np.append(lat_centers_f - half, lat_centers_f[-1] + half)
# coarse target grid
lon_edges_c = np.arange(lon_min, lon_max + tgt_res, tgt_res)
lat_edges_c = np.arange(lat_min, lat_max + tgt_res, tgt_res)
ds_coarse = xr.Dataset(
coords={
"lon": (["lon"], (lon_edges_c[:-1] + lon_edges_c[1:]) / 2),
"lat": (["lat"], (lat_edges_c[:-1] + lat_edges_c[1:]) / 2),
"lon_b": (["lon_b"], lon_edges_c),
"lat_b": (["lat_b"], lat_edges_c),
}
)
# build regridder
ds_fine_template = xr.Dataset(
{"precip": (["lat", "lon"], np.zeros((n_rows, n_cols)))},
coords={
"lon": (["lon"], lon_centers_f),
"lat": (["lat"], lat_centers_f),
"lon_b": (["lon_b"], lon_edges_f),
"lat_b": (["lat_b"], lat_edges_f),
}
)
# add a mask so conservative_normed knows which cells are valid
ds_fine_template["mask"] = xr.where(np.isfinite(ds_fine_template["precip"]), 1, 0).astype(int)
regridder = xe.Regridder(
ds_fine_template, ds_coarse,
method="conservative_normed",
periodic=False,
ignore_degenerate=True
)
# ══════════════════════════════════════════════════════════════════
# 4. LOOP OVER DATES — resample + conservative regrid
# ══════════════════════════════════════════════════════════════════
daily_grids = {}
for date, group in ds_day.groupby('date'):
if group.empty:
continue
swath_def = SwathDefinition(
lons=group['Longitude'].to_numpy(),
lats=group['Latitude'].to_numpy()
)
resampled = kd_tree.resample_nearest(
swath_def,
group['PrecipRateNearSurface'].values,
area_def,
radius_of_influence=8000,
fill_value=None
)
ds_fine = xr.Dataset(
{"precip": (["lat", "lon"], resampled)},
coords={
"lon": (["lon"], lon_centers_f),
"lat": (["lat"], lat_centers_f),
"lon_b": (["lon_b"], lon_edges_f),
"lat_b": (["lat_b"], lat_edges_f),
}
)
ds_fine["precip"] = ds_fine["precip"].fillna(0.0)
precip_coarse = regridder(ds_fine["precip"])
daily_grids[date] = precip_coarse
# ══════════════════════════════════════════════════════════════════
# 5. STACK INTO SINGLE DATAARRAY
# ══════════════════════════════════════════════════════════════════
precip_all = xr.concat(
list(daily_grids.values()),
dim=pd.DatetimeIndex(list(daily_grids.keys()), name="time")
)