问题描述
我在此请求您在 Python 方面的帮助。事实上,我有来自 IMERG/GPM(全球降水测量)的 NetCDF 数据,它有 30 分钟的时间分辨率,我想计算特定日期的总和或聚合事件降雨量,其中我知道每个日期的开始和结束我想聚合。 我已经尝试使用 resample 函数为每个开始时间戳到结束时间戳执行此操作但没有成功,并将其保存在 netcdf 文件中。 我附上了我的 sript 和 .csv 文件,其中包含每个聚合的开始和结束日期。
解决方法
我个人没有看到上传的文件,但你的描述对我来说已经足够清楚了。
我不确定 .resample
方法是否能满足您的需求,如果您的开始和结束是任意的:重新采样需要一个特定的频率,例如每天、每周或每月——请在此处查看可用频率的概述: https://pandas.pydata.org/docs/user_guide/timeseries.html#dateoffset-objects
但是,使用 xarray 的 groupby
和 numpy searchsorted
:https://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)等。