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

标签 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 时间 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 ... 295-195.8994 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'

但输出只是

'air_temperature

我非常感谢您对策划此 grpah 的任何建议!非常感谢,如果您需要任何进一步的信息,请随时询问,我会尽快回复。

最佳答案

计算月平均值

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

Similar to pandas, the components of datetime objects contained in a given DataArray can be quickly computed using a special .dt accessor.

...

The .dt accessor works on both coordinate dimensions as well as multi-dimensional data.

xarray also supports a notion of “virtual” or “derived” coordinates for datetime components implemented by pandas, including “year”, “month”, “day”, “hour”, “minute”, “second”, “dayofyear”, “week”, “dayofweek”, “weekday” and “quarter”

在您的情况下,您需要在 groupby 中使用日期时间坐标的名称(无论其名称是什么)以及 .dt.month 引用。如果您的日期时间坐标名为“time”,则 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扩展项目。它目前处于早期阶段并且处于试验阶段,但它可以满足您的需求。

关于matplotlib - 将 xarray 每日数据分组为每月平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68448310/

相关文章:

python - 如何创建离散二维直方图

python - pandas Series'对象没有属性 'find'

matlab - Matlab中是否可以只排列图形的最大极限?

r - 如何在 R 中用网格绘制非线性决策边界?

python - 是否可以在 FTP 服务器上调用 xarray open_mfdataset?

python - 合并具有相同范围但不同空间分辨率的 xarray 数据集

python - 使用 matplotlib 绘制具有负半径的函数的极坐标图

python - matplotlib 在 IPython 中不使用 matplotlibrc 文件

python - 在 python 中的 matplotlib 中的 logscale 上绘制问题

python - 如何识别 xarray 中的时间、lon 和 lat 坐标?