matplotlib - 将 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 的任何建议!非常感谢您,如果您需要任何进一步的信息,请不要犹豫,我会尽快回复。
解决方案
计算月均值
xarray 文档有一个关于在任何日期时间维度上使用日期时间访问器的有用部分:
与pandas类似,包含在给定中的日期时间对象的组件
DataArray
可以使用特殊的 .dt 访问器快速计算。...
.dt 访问器适用于坐标维度和多维数据。
xarray 还支持pandas 实现的日期时间组件的“虚拟”或“派生”坐标的概念,包括“年”、“月”、“日”、“小时”、“分钟”、“秒”、“年日”, “星期”、“星期几”、“工作日”和“季度”</p>
在您的情况下,您需要使用日期时间坐标的名称(无论其名称如何)以及.dt.month
groupby 中的引用。如果您的日期时间坐标名为“时间”,则 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扩展项目。它目前处于早期阶段并且是实验性的,但它可以满足我的需求。
推荐阅读
- javascript - 谷歌浏览器:html5 视频随机播放或不播放
- ruby-on-rails - 为单个延迟作业添加最大尝试
- node.js - 我们如何指出该字段在 apidocjs 中是可选/强制的?
- asp.net - 使用与 Microsoft.CognitiveServices.Speech 异步的授权令牌进行持续识别
- java - 从数组中删除重复元素的最佳方法是什么?
- python - 以下哪个 SSL 证书版本是正确的?
- libgdx - 如果我点击屏幕的另一个位置,我希望 LibGDX 触摸板移动到新位置,但我希望它立即使用
- linux - 如何从服务器 url 中排除其他域?
- javascript - Google Chrome DevTools 控制台中的代码生成输入
- c# - Azure 服务总线 | 分区队列