如何使用xarray选择和求和从开始到结束时间戳的特定时间?

问题描述

我在此请求您在 Python 方面的帮助。事实上,我有来自 IMERG/GPM(全球降水测量)的 NetCDF 数据,它有 30 分钟的时间分辨率,我想计算特定日期的总和或聚合事件降雨量,其中我知道每个日期的开始和结束我想聚合。 我已经尝试使用 resample 函数为每个开始时间戳到结束时间戳执行此操作但没有成功,并将其保存在 netcdf 文件中。 我附上了我的 sript 和 .csv 文件,其中包含每个聚合的开始和结束日期。

解决方法

我个人没有看到上传的文件,但你的描述对我来说已经足够清楚了。

我不确定 .resample 方法是否能满足您的需求,如果您的开始和结束是任意的:重新采样需要一个特定的频率,例如每天、每周或每月——请在此处查看可用频率的概述: https://pandas.pydata.org/docs/user_guide/timeseries.html#dateoffset-objects

但是,使用 xarray 的 groupby 和 numpy searchsortedhttps://numpy.org/doc/stable/reference/generated/numpy.searchsorted.html

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

ds = xr.open_dataset("netcdf-data.nc")
df = pd.read_csv("starts-and-ends.csv")
ds["periodnumber"] = ("time",np.searchsorted(df["time"],ds["time"]))

Searchsorted 会给每个时间步一个数字,例如:

period_boundaries = [1,5,10]
timesteps = [1,2,3,4,6,7,9,10]
print(np.searchsorted(period_boundaries,timesteps))

结果:

[0 1 1 1 1 2 2 2 2]

日期时间对象的原理相同(只要它们可以排序,并且具有可比性)。

接下来,使用此变量对您的时间步进行分组并聚合它们:

aggregated = ds["rainfall"].groupby(ds["periodnumber"]).sum("time")

这有望澄清基本思想。您的数据集可能没有完全相同的变量名称,您必须确保将 csv 中的日期正确解析为日期(例如 set parse_dates=True: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)等。