微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

虽然时间不是我的 3D 矩阵的维度

如何解决虽然时间不是我的 3D 矩阵的维度

我有一个 3D 矩阵,其中包含感兴趣的数据,称为 iasi_allAirports,大小为 (6,10000,3),维度为 (airport,numofprofile,level)。数据可以是 nan 的浮点数。我还有一个具有相应日期的相同形状的 datetime64 3D 矩阵。 我希望能够像

一样使用xarray的时间选择功能
xa_summer = xa[xa.dt.season=='JJA']

ds.sel(date="2000-01")

我不太明白在我的情况下是否需要构建 DataArray 或 Dataset ? (一个论点是季节 getter 仅适用于 DataArray)

这是我构建它们的代码

ds = xr.DataArray(iasi_allAirports,coords = {'airport': listofAirportNames,'profnum': np.arange(0,10000 ),'level': levels,'date': ( ('airport','profnum','level'),timeMatrix )
                            },dims = ['airport','level'] )

ds = xr.Dataset(
    { 'iasi':   (['airport','level'],iasi_allAirports) },timeMatrix )
              },)

在这两种情况下,如果我这样做

ds.sel(date='2019-06')

它说:

维度或多索引级别 ['date'] 不存在

使用 DataArray,

ds[ds.dt.season=='JJA']

说:

TypeError: '.dt' 访问器仅适用于带有 datetime64 的 DataArray timedelta64 dtype 或用于包含 cftime 日期时间对象的数组。

有没有办法在不重新组织矩阵的情况下做我想做的事?

谢谢

解决方法

我不知道 xarray,但您可以使用带有掩码的 numpydatetime

import numpy as np
from datetime import datetime,timedelta

# Creating random 3D data
data = np.random.random((20,20,20))
# Creating a 3D array of dates
base = datetime.today()
dates = np.array([base - timedelta(days=x) for x in range(20*20*20)])
dates = dates.reshape(data.shape)

# Using masks to find the data corresponding to a specific date
print(data[dates == base])
print(data[dates == dates[12,9,11]])

您可以在 google 上找到大量关于如何将字符串转换为日期时间对象的示例。例如:

date_string = '2021-May-20'
date = datetime.strptime(date_string,'%Y-%B-%d')

请注意 datetime 对象还包含有关小时、分钟和秒的详细信息。因此,根据日期的精确度以及您想要的选择方式,您可能需要处理这个问题。

最后,请注意,我建议使用 datetime 模块是因为您谈到了 dates,并且非常适合处理这些问题。但是,您只能使用 numpy 应用相同的过程,并将日期数组保留为字符串数组;并且仍然使用 numpy 面具:

data[dates == base]
,

我设法通过 .where 获得了一些东西:

ds_summer = ds.where( (ds.time.dt.month == 6) | (ds.time.dt.month == 7) | (ds.time.dt.month == 8) )

但是 ds.time.dt.season 不起作用:“用作索引的数组必须是整数(或布尔值)类型”

我知道 xarray 数据集只是一个包含多个 DataArray 的对象,这对我来说很方便,因为我实际上还有另外两个 DataArray(IM 和 IMS)。 时间可以作为坐标:

ds = xr.Dataset(
    { 'iasi':   (['airport','profnum','level'],iasi_allAirports),'IM':     (['airport',IM_allAirports),'IMS':    (['airport',IM_allAirports)   },coords = {'airport': listOfAirportNames,'profnum': np.arange(0,iasi_allAirports.shape[1] ),'level': levels,'time': ( ('airport','level'),timeMatrix )
} )

或作为数据:

ds = xr.Dataset(
    { 'iasi':   (['airport','time': ( ['airport',timeMatrix ) },'level': levels
} )

两者都有效。不同的是,非夏令时作为数据放置时时间会消失,而作为坐标放置时不会消失。

为了便于查看,df_summer = ds_summer.to_dataframe() 会将矩阵更改为 2D Pandas 数据框。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。