将 xarray 每日数据分组为每月平均值

时间:2021-07-20 00:27:25

标签: matplotlib plot python-xarray temperature timeserieschart

我希望绘制一个图表,代表从 1981-01-01 到 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'"

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

Graph

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

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

但输出仅仅是

"'空气温度"

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

1 个答案:

答案 0 :(得分:1)

计算月均值

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

<块引用>

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

...

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

xarray 还支持 pandas 实现的 datetime components 的“虚拟”或“派生”坐标概念,包括“年”、“月”、“日”、“小时”、“分钟”、“秒” ”、“年日”、“周”、“周日”、“工作日”和“季度”

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

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

或者,使用字符串简写:

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

xarray 中的单位

至于单位,除了绘图和显示之外,您肯定应该以任何方式知道 xarray does not interpret/use attributes or metadata

以下作业:

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

只是将字符串“kelvin”分配给用户定义的属性“units”——没有别的。这可能会显示为图中数据的单位,但这并不意味着数据不是华氏度或美元或 m/s。这只是你放在那里的一个字符串。

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

如果您确实想要明确地使用单元,请查看 pint-xarray 扩展项目。它目前处于早期阶段并且处于实验阶段,但它确实符合我的想法。