python - 使用库 xarray (python) 进行分组后,时间维度错误

标签 python python-xarray

我的问题是我想在 python 中使用 xarray-library 的简单功能,但是在聚合数据的情况下我遇到了时间维度的问题。

我打开了一个数据集,其中包含 2013 年的每日数据: datset=xr.open_dataset(filein)

文件内容为:

<xarray.Dataset>
Dimensions:       (bnds: 2, rlat: 228, rlon: 234, time: 365)
Coordinates:
  * rlon          (rlon) float64 -28.24 -28.02 -27.8 -27.58 -27.36 -27.14 ...
  * rlat          (rlat) float64 -23.52 -23.3 -23.08 -22.86 -22.64 -22.42 ...
  * time          (time) datetime64[ns] 2013-01-01T11:30:00 ...
Dimensions without coordinates: bnds
Data variables:
    rotated_pole  |S1 ''
    time_bnds     (time, bnds) float64 1.073e+09 1.073e+09 1.073e+09 ...
    ASWGLOB_S     (time, rlat, rlon) float64 nan nan nan nan nan nan nan nan ...
Attributes:
    CDI:                       Climate Data Interface version 1.7.0 (http://m...
    Conventions:               CF-1.4
    references:                http://www.clm-community.eu/
    NCO:                       4.6.7
    CDO:                       Climate Data Operators version 1.7.0

当我现在使用 groupby 方法计算月均值时,时间维度被破坏了:

datset.groupby('time.month')
<xarray.core.groupby.DatasetGroupBy object at 0x246a250>
>>> datset.groupby('time.month').mean('time')
<xarray.Dataset>
Dimensions:    (bnds: 2, month: 12, rlat: 228, rlon: 234)
Coordinates:
  * rlon       (rlon) float64 -28.24 -28.02 -27.8 -27.58 -27.36 -27.14 ...
  * rlat       (rlat) float64 -23.52 -23.3 -23.08 -22.86 -22.64 -22.42 -22.2 ...
  * month      (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Dimensions without coordinates: bnds
Data variables:
    time_bnds  (month, bnds) float64 1.074e+09 1.074e+09 1.077e+09 1.077e+09 ...
    ASWGLOB_S  (month, rlat, rlon) float64 nan nan nan nan nan nan nan nan ...

现在我有一个月维度而不是时间维度,值从 1 到 12。这是“均值”函数的副作用吗?只要我不使用这个平均函数,时间变量就会被保留。

我做错了什么?文档和本论坛中给出的示例似乎有不同的行为。在那里,时间戳被保留,除了使用每个月的第一天。

我可以 reshape 旧的时间维度吗?如果我想要时间戳指示月中,“time_bounds”指示每个平均值的间隔,即月初、月末,该怎么办。

谢谢你的帮助,罗尼

最佳答案

您所描述的是预期行为:当您使用.groupby聚合并应用缩减函数时,例如mean,您聚合的维度将替换为组的索引 - 在本例中为 12 个月。

假设您有一个多年时间序列。然后 ds.groupby('time.month').mean(dim='time') 为您提供任何一年中每个月的平均值(例如所有“一月”合为一个平均值)。

您确定不想获取月平均值吗?那么 ds.resample(time='1m').mean(dim='time') 就是您所需要的,它实际上会为您提供适当的时间维度。

但是,如果您确实想要多年汇总平均值但想要一个合适的时间维度,那么您可以替换您的新month 索引和 time 索引,如下所示:

ds['month'] = [datetime.datetime(2017, month, 1) for month in ds['month'].values]
ds = ds.rename({'month': 'time'})

2017 是您选择作为月度索引年份的年份。

关于python - 使用库 xarray (python) 进行分组后,时间维度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45039794/

相关文章:

python - 将 pandas 数据框与数据透视表合并

python - 如何在Python中获得系统显示分辨率的宽高比?

javascript - 如何自动/动态导入自己的 angularjs javascript 文件?

python - 转换数据框

python - 从 xarray 数据集中的闰年中删除闰日

python - 如何在 NetCDF 上应用 xarray u_function 并将二维数组(多个新变量)返回到数据集

python - 在 Keras 损失函数中 reshape TensorFlow 张量?

Python xarray.concat 然后 xarray.to_netcdf 生成巨大的新文件大小

python - 导入 xarray 和 odc python 包时出现打字错误

python - 更改线图中线段的颜色