Python 引入新坐标';冬季&x27;

Python 引入新坐标';冬季&x27;,python,python-xarray,Python,Python Xarray,我有一个xarray数据集,其中包含一个变量数年的每日数据(但每年只有1月、2月、3月和12月) 例如,我在访问特定的年-月组合时没有问题,比如“显示2009年1月的数据”。但我正在努力引入一个新的坐标,它允许我访问 冬季1号(包含2008年12月、2009年1月、2009年2月和2009年3月的每日数据) 冬季2号(包含2009年12月、2010年1月、2010年2月和2010年3月的每日数据) 冬季3号等等 这是为了让您了解我的数据集“数据”的外观: <xarray.Dataset

我有一个xarray数据集,其中包含一个变量数年的每日数据(但每年只有1月、2月、3月和12月)

例如,我在访问特定的年-月组合时没有问题,比如“显示2009年1月的数据”。但我正在努力引入一个新的坐标,它允许我访问

  • 冬季1号(包含2008年12月、2009年1月、2009年2月和2009年3月的每日数据)

  • 冬季2号(包含2009年12月、2010年1月、2010年2月和2010年3月的每日数据)

  • 冬季3号等等

这是为了让您了解我的数据集“数据”的外观:

<xarray.Dataset>
Dimensions:    (latitude: 1, longitude: 1440, time: ...)
Coordinates:
  * longitude  (longitude) float32 -180.0 -179.75 -179.5 ... 179.25 179.5 179.75
  * latitude   (latitude) float32 60.0
  * time       (time) datetime64[ns] 1980-01-01 ... 2010-03-28
Data variables:
    u          (time, latitude, longitude) float32 dask.array<shape=(..., 1, 1440), chunksize=(..., 1, 1440)>

<xarray.DataArray 'time' (time: 476)>
array(['1980-01-01T00:00:00.000000000', '1980-01-01T06:00:00.000000000',
       '1980-01-01T12:00:00.000000000', ..., '1981-02-28T06:00:00.000000000',
       '1981-02-28T12:00:00.000000000', '1981-02-28T18:00:00.000000000'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1980-01-01 ... 1981-02-28T18:00:00
Attributes:
    long_name:  time

您可以创建一个函数来定义新坐标(冬季)

def获取冬季年份(日期):
y=日期.dt.year.values
m=日期.dt.month.value
ym=列表(zip(y,m))
如果范围(len(ym))]内的i的ym[i][1]<4 else(ym[i][0]-ym[0][0]+2,则返回[(ym[i][0]-ym[0][0]+1]
然后我们可以根据新的坐标进行分组并进行计算

airtemps = xr.tutorial.open_dataset('air_temperature')
d = airtemps.assign_coords(time=get_winter_year(airtemps['time']))
d = d.rename({'time' : 'Winter'})
d.groupby('Winter').mean(dim=('Winter'))

> <xarray.Dataset> Dimensions:  (Winter: 3, lat: 25, lon: 53)
> Coordinates:   
> * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0    
> * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0   
> * Winter   (Winter) int64 1 2 3 
>  Data variables:
>      air  (Winter, lat, lon) float32 244.61775 244.4874 ... 297.86255
airtemps=xr.tutorial.open\u数据集(“空气温度”)
d=气温。分配坐标(时间=获取冬季年(气温['time']))
d=d.rename({'time':'Winter'})
d、 groupby('Winter')。平均值(dim=('Winter'))
>尺寸:(冬季:3,横向:25,纵向:53)
>坐标:
>*lat(lat)浮动32 75.0 72.5 70.0 67.5 65.0。。。25.0 22.5 20.0 17.5 15.0    
>*lon(lon)浮动32 200.0 202.5 205.0 207.5。。。322.5 325.0 327.5 330.0   
>*冬季(冬季)int64 1 2 3
>数据变量:
>空气(冬季、纬度、经度)浮标32 244.61775 244.4874。。。297.86255

请制作一个仅包含几行的示例数据框。日期/月份是否作为索引提供?抱歉,刚刚更新。这就是你的意思吗?(我发布的时间数组只是我整个数据集的一小部分)
airtemps = xr.tutorial.open_dataset('air_temperature')
d = airtemps.assign_coords(time=get_winter_year(airtemps['time']))
d = d.rename({'time' : 'Winter'})
d.groupby('Winter').mean(dim=('Winter'))

> <xarray.Dataset> Dimensions:  (Winter: 3, lat: 25, lon: 53)
> Coordinates:   
> * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0    
> * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0   
> * Winter   (Winter) int64 1 2 3 
>  Data variables:
>      air  (Winter, lat, lon) float32 244.61775 244.4874 ... 297.86255