如何解决虽然时间不是我的 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
,但您可以使用带有掩码的 numpy
和 datetime
。
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 举报,一经查实,本站将立刻删除。