首页 > 解决方案 > 将 xarray 每日数据分组为每月均值

问题描述

我希望绘制一张表示从 1981 年 1 月 1 日到 2016 年 12 月 31 日的月度温度的图表。

我想要 x 轴上的月份“Jan Feb Mar Apr May...Dec”和温度记录作为 y 轴,因为我的计划是将 1981 - 1999 年的月度温度记录与 2000 - 2016 年的月度温度记录进行比较。

我读过数据没问题。

temp1 = xr.open_dataarray('temp1981-1999.nc') temp2 = xr.open_dataarray('temp2000-2016.nc')

并摆脱了纬度和经度尺寸

temp1mean = temp1.mean(dim=['latitude','longitude']) temp2mean = temp2.mean(dim=['latitude','longitude'])

我尝试将其转换为数据框以允许我进行下一步,例如使用 group by 平均月份

temp1.cftime_range(start=None, end=None, periods=None, freq='M', normalize=False, name=None, closed=None, calendar='standard')

t2m time 1981-01-01 276.033295 1981-02-01 278.882935 1981-03-01 282.905579 1981-04-01 289.908936 1981-05-01 294.862457 ... ... 1999-08-01 295.841553 1999-09-01 294.598053 1999-10-01 289.514771 1999-11-01 283.360687 1999-12-01 278.854431

monthly = temp1mean.groupby(temp1mean.index.month).mean()

但是我收到以下错误。

‘DataArray’对象没有属性‘index’

因此,我想知道是否有任何方法可以对所有每月均值进行分组并创建如下图表。

图形

除了主要问题之外,如果您还可以建议在绘制图表时将单位开尔文转换为摄氏度的方法,我将不胜感激。正如我尝试过的命令

celsius = temp1mean.attrs['units'] = 'kelvin'

但输出仅仅是

‘空气温度

我非常感谢您对绘制这个 grpah 的任何建议!非常感谢您,如果您需要任何进一步的信息,请不要犹豫,我会尽快回复。

标签: matplotlibplotpython-xarraytemperaturetimeserieschart

解决方案


计算月均值

xarray 文档有一个关于在任何日期时间维度上使用日期时间访问器的有用部分:

与pandas类似,包含在给定中的日期时间对象的组件DataArray可以使用特殊的 .dt 访问器快速计算。

...

.dt 访问器适用于坐标维度和多维数据。

xarray 还支持pandas 实现的日期时间组件的“虚拟”或“派生”坐标的概念,包括“年”、“月”、“日”、“小时”、“分钟”、“秒”、“年日”, “星期”、“星期几”、“工作日”和“季度”</p>

在您的情况下,您需要使用日期时间坐标的名称(无论其名称如何)以及.dt.monthgroupby 中的引用。如果您的日期时间坐标名为“时间”,则 groupby 操作将是:

monthly_means = temp1mean.groupby(temp1mean.time.dt.month).mean()

或者,使用字符串速记:

monthly_means = temp1mean.groupby('time.month').mean()

xarray 中的单位

至于单位,您绝对应该知道xarray 不会以任何方式解释/使用属性或元数据,除了绘图和显示。

以下作业:

temp1mean.attrs['units'] = 'kelvin'

只需将字符串“kelvin”分配给用户定义的属性“units” - 仅此而已。这可能会在图中显示为数据的单位,但这并不意味着数据不是华氏度、美元或米/秒。这只是你放在那里的一根绳子。

如果数据实际上是以开尔文为单位的,那么我所知道的将其转换为摄氏度的最佳方法是temp1mean - 273.15:)

如果您确实想明确使用单位,请查看pint-xarray扩展项目。它目前处于早期阶段并且是实验性的,但它可以满足我的需求。


推荐阅读