繁体   English   中英

使用 numpy 日期时间数组更新 xarray 维度值不适用于 .netCDF 文件

[英]Updating xarray dimension values with numpy datetime array not working with netCDF file

一个例子:

x = xr.Dataset(
    {
        "temperature_c": (
            ("lat", "lon", "date"),
            20 * np.random.rand(8).reshape(2, 2, 2),
        ),
    },
    coords={"lat": [10, 20], "lon": [150, 160], "date": [1, 2]},
)


>>> x
>>> <xarray.Dataset>
Dimensions:        (lat: 2, lon: 2, date: 2)
Coordinates:
  * lat            (lat) int32 10 20
  * lon            (lon) int32 150 160
  * date           (date) int32 1 2
Data variables:
    temperature_c  (lat, lon) float64 10.98 14.3 12.06 10.9

和一个 numpy 日期时间数组:

import numpy as np
times = np.array(['2007-07-13', '2006-01-13'], dtype='datetime64')

使用x.update({"date": times})工作正常,结果是我想要的。

>>> <xarray.Dataset>
Dimensions:        (lat: 2, lon: 2, date: 2)
Coordinates:
  * lat            (lat) int32 10 20
  * lon            (lon) int32 150 160
  * date           (date) datetime64[ns] 2007-07-13, 2006-01-13

Data variables:
    temperature_c  (lat, lon) float64 10.98 14.3 12.06 10.9

在我的例子中,我读入了一个 .netcdf 文件作为 xarray,除了更大之外尺寸相似。 我的数据集如下所示:

>>> ds
>>> <xarray.Dataset>
Dimensions:  longitude: 720 latitude: 361 time: 504
Coordinates:
longitude  (longitude)  float32        -179.5 -179.0 ... 179.5 180.0
latitude   (latitude)   float32        -90.0 -89.5 -89.0 ... 89.5 90.0
time       (time)       float64           0 1 2 3 4 5 ... 499 500 501 502 503

当我尝试做同样的事情时,使用ds.update({"time": times})更新时间坐标会导致以下 xarray.Dataset:

>>> ds
>>> <xarray.Dataset>
Dimensions:  dim_0: 504 longitude: 720 latitude: 361 time: 504
Coordinates:
time       (dim_0)      datetime64[ns]  1979-01-15 ... 2020-12-15
longitude  (longitude)  float32        -179.5 -179.0 ... 179.5 180.0
latitude   (latitude)   float32        -90.0 -89.5 -89.0 ... 89.5 90.0
dim_0      (dim_0)      int64           0 1 2 3 4 5 ... 499 500 501 502 503

这里有什么区别? 为什么在使用加载的 in.netCDF 数据集时更新维度不起作用? 我觉得必须这样做,因为突然添加了一个dim_0维度,但这以前没有发生过。

它不能像这样使用,因为 xarray.Dataset 仍然使用dim_0作为维度值。 当我尝试删除维度并将时间分配为新的主要维度时,这不起作用并删除了所有数据变量。 交换维度名称也不起作用,因为它不会将dim_0识别为有效的维度名称。

可以在此处找到源数据集。 它是 500mb。

这非常简单,在 xarray 数据集中不需要任何方法,因为这些都不起作用:

ds["time"] = ("time", times)

成功了吗

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM