【问题标题】:How to find average value for netCDF over entire time period recorded in dataset (Python)?如何在数据集(Python)中记录的整个时间段内找到 netCDF 的平均值?
【发布时间】:2022-01-13 18:18:21
【问题描述】:

我下载了一个已发布的 netCDF 文件,其中包含过去 12 万年的全球各种气候数据。 (请参阅此处包含的公共 .nc 文件:https://figshare.com/articles/dataset/LateQuaternary_Environment_nc/12293345/3)。有很多变量,包括温度、降水等。

我只想在全球范围内找出过去 120,000 年的平均降水量是多少。也就是说,我想最终得到一张整个时间平均降水量的地图行星。重要的一点是时间间隔不是等距的,它们在 1 到 2 千年之间变化。在试图解决这个问题时,我在使用 Xarray 时遇到了很多问题,因为我之前没有使用过 netCDF。我尝试使用这个简单的方法:

import xarray as xr
climate_file = 'LateQuaternary_Environment.nc' #Dataset linked to above
ds = xr.open_dataset(climate_file, decode_times=False)
ppt = ds.precipitation
ppt_avg = ppt.mean('time')

但是,当我打印(ppt_avg)时,数组中的所有值都是 NaN。另外,即使这给出了实际值,我也不确定它们是否是正确的平均值,因为时间间隔都是不同的,所以我不必以某种方式对它们进行加权,或者重新采样时间数据吗?我不知道,因为我不了解 netCDF 或 Xarray 函数的时间平均是如何工作的。我什至不确定 Xarray 是否适合使用。

欢迎任何帮助,谢谢!

【问题讨论】:

  • 我通过使用另一个(相关)数据集(80 万年的数据集而不是 12 万年的数据集)“解决了”这个问题。在这个新数据集中,这些年的间隔是相等的。

标签: python netcdf python-xarray netcdf4


【解决方案1】:

我没有对其进行测试,但我认为解决方案可能是在均匀分布的时间网格上对您的数据进行上采样并在计算平均值之前进行插值:

da = da.resample(time = "1000Y").interpolate("linear")
da.mean(dim = "time")

【讨论】:

  • 谢谢你!这也是我昨天尝试过的,但我立即收到错误消息:“TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但得到了 'Int64Index' 的实例”。所以我放弃了——时间单位好像不太对?
  • @g.is.stuck 我想可能是因为你在 open_dataset 中设置了 decode_times = False。
  • 谢谢!可能就是这样,但我输入它的原因是为了解决另一个错误......如果我删除“decode_times = False”,那么我会得到:“ValueError:无法用'解码时间单位'从现在开始'默认日历'。尝试使用 decode_times=False 打开您的数据集,如果未安装,请安装 cftime。"
  • 我从来没有遇到过这个问题,但我想 -120.000 不能很好地适应默认日历是有道理的。 mean(dime = 'time') 应该可以工作。对于上采样,如果你能弄清楚你想要的时间网格,你应该可以用da.reindex(time=new_grid, method='None').interpolate_na(dim='time", method='linear')来做。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2020-12-15
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多