具有自定义年初的数据集统计信息

Dataset statistics with custom begin of the year

我想对 xarray 数据集中的每日时间序列数据进行一些年度统计(累积总和)。棘手的部分是我考虑的年份开始的那一天必须是灵活的并且时间序列包含闰年。

我尝试过,例如以下:

rollday = -181
dr = pd.date_range('2015-01-01', '2017-08-23')
foo = xr.Dataset({'data': (['time'], np.ones(len(dr)))}, coords={'time': dr})
foo_groups = foo.roll(time=rollday).groupby(foo.time.dt.year)
foo_cumsum = foo_groups.apply(lambda x: x.cumsum(dim='time', skipna=True))

这是 "unfavorable" 主要是因为两件事: (1) 滚动不考虑闰年,所以每个闰年得到一天的偏移量和 (2) 第一年的开始(直到 6 月底)被附加到滚动时间序列的末尾,这会造成一些 "fake year" 的累积总和不再有意义。

我也试过先切断时间序列的末端,但是滚动不再起作用了。对我来说,重新采样似乎也不是一种选择,因为我找不到合适的 pandas 频率字符串。

我确定有 better/correct 方法可以做到这一点。有人可以帮忙吗?

您可以使用 xarray.DataArray 来指定组。一种方法是创建一组定义组 ID 的值(年):

# setup sample data
dr = pd.date_range('2015-01-01', '2017-08-23')
foo = xr.Dataset({'data': (['time'], np.ones(len(dr)))}, coords={'time': dr})

# create an array of years (modify day/month for your use case)
my_years = xr.DataArray([t.year if ((t.month < 9) or ((t.month==9) and (t.day < 15))) else (t.year + 1) for t in foo.indexes['time']],
                        dims='time', name='my_years', coords={'time': dr})

# use that array of years (integers) to do the groupby
foo_cumsum = foo.groupby(my_years).apply(lambda x: x.cumsum(dim='time', skipna=True))

# Voila!
foo_cumsum['data'].plot()