【问题标题】:Grouping xarray daily data into monthly means将 xarray 每日数据分组为每月均值
【发布时间】:2021-09-27 13:53:09
【问题描述】:

我希望绘制一张图表,表示从 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 的任何建议!非常感谢您,如果您需要任何进一步的信息,请随时询问,我会尽快回复。

【问题讨论】:

  • 手绘剧情加分! :) 感谢您不遗余力地向我们展示您想要实现的目标。

标签: matplotlib plot python-xarray temperature timeserieschart


【解决方案1】:

计算月均值

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

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

...

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

xarray 还支持由 pandas 实现的 datetime components 的“虚拟”或“派生”坐标的概念,包括“年”、“月”、“日”、“小时”、“分钟”、“秒”、 “dayofyear”、“week”、“dayofweek”、“weekday”和“Quarter”

在您的情况下,您需要在 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”——没有别的。这可能会在图中显示为数据的单位,但这并不意味着数据不是华氏度、美元或米/秒。这只是你放在那里的一个字符串。

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

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

【讨论】:

  • 感谢您的帮助 =]
  • 当然!这回答了问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2019-12-20
相关资源
最近更新 更多