【问题标题】:Split single monthly NetCDF file into daily averaged NetCDF multiple files using xarray使用 xarray 将单个月 NetCDF 文件拆分为每日平均 NetCDF 多个文件
【发布时间】:2019-06-19 23:15:13
【问题描述】:

我有 1 个 2007 年 9 月的 NetCDF 文件。它包含某些纬度/经度的 6 小时数据,其中包含风和湿度变量。每个变量的形状为(120, 45, 93):120次(一天4次),45个纬度和93个经度。使用以下代码,我可以获得所有变量的每日平均数据。现在,每个变量的形状都是(30, 45, 93)。时间为整数,单位为'hours since 1900-01-01 00:00:00.0'

从这个每日平均数据,我怎样才能将每天分成30个不同的NetCDF文件,文件名包含YYYY:MM:DD时间格式?

import xarray as xr
monthly_data = xr.open_dataset('interim_2007-09-01to2007-09-31.nc') 
daily_data = monthly_data.resample(time='1D').mean()

【问题讨论】:

    标签: python python-xarray netcdf4


    【解决方案1】:

    以防万一它对任何人有帮助,也可以直接从命令行执行计算每日平均值并划分为单独的每日文件的任务:

    cdo splitday -daymean in.nc day
    

    产生一系列文件 day01.nc day02.nc ...

    【讨论】:

      【解决方案2】:

      Xarray 在这样的时候有一个顶级函数 - xarray.save_mfdataset。在您的情况下,您可能希望使用 groupby 将数据集分解为逻辑块,然后创建相应文件名的列表。从那里开始,让save_mfdataset 完成剩下的工作。

      dates, datasets = zip(*ds.resample(time='1D').mean('time').groupby('time'))
      filenames = [pd.to_datetime(date).strftime('%Y.%m.%d') + '.nc' for date in dates]
      xr.save_mfdataset(datasets, filenames)
      

      【讨论】:

      • 在这种情况下,是不是zip创建的分组数据集列表应该足够小,以便能够首先在内存中处理?
      • 不,groupby 操作将返回底层数据的视图或惰性切片。这种方法在使用 dask 时也会更好地工作,因为根据您使用的调度程序,save_mfdataset 步骤可以并行执行。
      • 再澄清一下,我们在哪里将数据集分成块? groupby 操作是否自动执行?通常我必须在循环中使用sel 方法,然后保存多个数据集,我想知道sel 方法是否也会自动将数据集分成块?否则,它与使用to_netcdf 相同。谢谢!
      • 是的,groupby 方法正在将数据集分组。在您的情况下,您希望每个时间步都有一个组,所以我刚刚使用了'time'。如果我想要按年分组,我可以使用time.year。有关日期时间选项的更多信息:xarray.pydata.org/en/stable/…
      • 谢谢,一开始我对zip的方法不是很了解,我用sel对年数据集进行切片。现在,我可以看到groupbysave_mfdataset 结合使用时的强大功能。绝妙的方法!
      【解决方案3】:

      阅读完文档后,您可以使用 NetCDF4 的num2date 将整数转换为日期。 你也可以使用isel()索引xarray.dataset

      from netCDF4 import num2date
      for i in range(30):
          day = daily_data.isel(time=i)
          the_date = num2date(day.time.data, units='hours since 1900-01-01 00:00:00')
          day.to_netcdf(str(the_date.date())+'.nc', format='NETCDF4')
      

      【讨论】:

      • 感谢@BanishedBot 它确实帮了很多忙。但是 xarray 会自动读取日期,因此不需要转换。
      • 虽然这是有用的信息(我对此表示赞同),但我不明白为什么它是公认的“最佳”答案,但实际上并没有解决所提出的问题。 jhamman 的回答就是这样做的。
      猜你喜欢
      • 2020-06-19
      • 2020-12-15
      • 2018-10-10
      • 2021-11-13
      • 2018-01-29
      • 2018-09-12
      • 2018-04-23
      • 2017-05-05
      • 2014-12-02
      相关资源
      最近更新 更多