【问题标题】:Xarray change unit in time variableXarray 在时间变量中改变单位
【发布时间】:2020-10-25 20:30:00
【问题描述】:

我有一个 nc 文件,其中的时间变量无法被 xarray.open_dataset() 解码,因为单位是“days_since_Jan11900”,这是来自 days 变量的完整信息:

<xarray.DataArray 'days' (time: 87600)>
array([679352., 679353., 679354., ..., 766949., 766950., 766951.])
Dimensions without coordinates: time
Attributes:
    units:      days_since_Jan11900
    long_name:  calendar_days

我已经用ds = xr.open_dataset('path/tmax_bcc-csm1-1.nc', decode_times = False)打开了文件,但现在我想把nc文件的单位改成Python可以轻松解码的东西。就我而言,时间单位是自 0000 年 1 月 1 日以来的现在天数。它最终将使我的分析变得更容易。

我该怎么做?

【问题讨论】:

  • 您确定参考日期是 0000 年 1 月 1 日吗?根据 CF 约定,0000 年在儒略历或公历中无效。

标签: python netcdf python-xarray


【解决方案1】:

要解码时间,xarray 会搜索包含units 属性的变量,其形式为"{time_unit} since {reference_date}"。在您的情况下,我将覆盖您的 DataArray 上的单位属性,然后手动解码时间:

ds.days.attrs["units"] = "days since 0000-01-01"
result = xr.decode_cf(ds)

正如我所评论的,一个警告是我怀疑您拥有的参考日期无效,因此解码时间可能会引发错误。

【讨论】:

  • 这绝对解决了问题。实际上,当年份设置为 0000 时会引发错误。但是,这就是整数所表示的。你知道吗,如果我可以从所有整数中减去679352,然后将单位设置为'days since 1860-01-01'
  • 是的,如果您确定时间序列中的第一个日期是 1860-01-01,那将是一个好方法。
  • 我是并且我成功了。感谢您的帮助,这真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2022-10-06
  • 2019-09-03
  • 2019-08-18
  • 2015-09-17
相关资源
最近更新 更多