使用 xarray 选择所有坐标值

Posted

技术标签:

【中文标题】使用 xarray 选择所有坐标值【英文标题】:Selecting the All Coordinate values using xarray 【发布时间】:2022-01-13 01:59:29 【问题描述】:

我正在使用 xarray 从 netcdf 文件中读取数据。

我正在将任何给定数据变量的数据导出为 CSV 格式。

这是一个示例数据变量

stratiform_snowfall_rate    (time, grid_latitude, grid_longitude) float32
Dimensions  = ('time', 'grid_latitude', 'grid_longitude')
No.of Dimensions  = 3
DataType    = float32
Shape       = (36, 548, 421)

我可以从 DataArray 中获取各个值。

但是,我希望每个坐标都有一组唯一的值。

即我想要我拥有 snowfall_rate 数据的所有纬度经度和时间值。

应该有 36 个唯一时间值、548 个纬度值和 421 个经度值。

谢谢 萨提什

【问题讨论】:

ds.to_dataframe().to_csv(filepath) 工作吗? 嗨 Machael,如果有多个变量,不确定 to_csv() 将如何存储。我希望每个变量都存储在单独的 csv 文件中,并且当我尝试将其保存为 csv 时,我收到 Memory Error:numpy.core._exceptions.MemoryError: Unable to allocate 19.8 PiB for an array with shape (36, 548 , 421, 3, 3, 3, 2, 2, 3, 3, 421, 547, 3) 和数据类型 float32。 您能否在问题中完整描述您要解决的问题?请注意,您可以遍历ds.data_vars 中的变量并执行ds[v].to_series().to_frame(name=v).to_csv()。也就是说,是的,csv 不是存储高维数据的好格式,最好将数据保留为 netcdf。 请注意,to_dataframe() 在一个数据集中存储多个变量,但数据集中的所有数组将首先相互广播,然后堆叠。所以这不适用于具有非均匀维度的数组。这可能会导致您看到的数组分配错误的大小爆炸。 Michael,我正在尝试获取给定数据变量的唯一坐标集。因为我试图将给定数据变量的数据连同坐标一起存储在它自己的 csv/parquet 文件中,并最终存储在一个 db 表中。 【参考方案1】:

谢谢大家。我可以读取坐标值。

这是一个示例:

dataArray = xr.DataArray(
    np.random.randn(4, 6),
    dims=("x", "y"),
    coords=
        "x": [-3.2, 2.1, 5.3, 6.5],
        "y": pd.date_range("2009-01-05", periods=6, freq="M"),
    ,
)

for i in range(len(dataArray.x)):
    for j in range(len(dataArray.y)):
        rowDict = 
        rowDict['x'] = dataArray.coords['x'].values[i]
        rowDict['y'] = pd.to_datetime(str(dataArray.coords['y'].values[j])).strftime('%Y.%m.%d %H.%M.%S')
        rowDict['val'] = dataArray.data[i, j]
        print(rowDict)

我得到的输出是:

'x': -3.2, 'y': '2009.01.31 00.00.00', 'val': 1.1672918170123077
'x': -3.2, 'y': '2009.02.28 00.00.00', 'val': -0.45000573967001745
'x': -3.2, 'y': '2009.03.31 00.00.00', 'val': -0.3070507637309568
'x': -3.2, 'y': '2009.04.30 00.00.00', 'val': -0.16715901864646582
'x': -3.2, 'y': '2009.05.31 00.00.00', 'val': 1.6700002681882784
'x': -3.2, 'y': '2009.06.30 00.00.00', 'val': 0.2303405222447574
'x': 2.1, 'y': '2009.01.31 00.00.00', 'val': -0.10394183859025365
'x': 2.1, 'y': '2009.02.28 00.00.00', 'val': -0.6399654408544677
'x': 2.1, 'y': '2009.03.31 00.00.00', 'val': -0.7322155474326156
'x': 2.1, 'y': '2009.04.30 00.00.00', 'val': 0.4443732649765692
'x': 2.1, 'y': '2009.05.31 00.00.00', 'val': 0.32141177764826817
'x': 2.1, 'y': '2009.06.30 00.00.00', 'val': 0.990286185910961
'x': 5.3, 'y': '2009.01.31 00.00.00', 'val': -1.0176437927897097
'x': 5.3, 'y': '2009.02.28 00.00.00', 'val': -0.23011079013897445
'x': 5.3, 'y': '2009.03.31 00.00.00', 'val': -0.17623947662095518
'x': 5.3, 'y': '2009.04.30 00.00.00', 'val': -1.567830106123095
'x': 5.3, 'y': '2009.05.31 00.00.00', 'val': 0.3510704631729717
'x': 5.3, 'y': '2009.06.30 00.00.00', 'val': -1.619554124545969
'x': 6.5, 'y': '2009.01.31 00.00.00', 'val': -0.7614693432763142
'x': 6.5, 'y': '2009.02.28 00.00.00', 'val': 1.1021880682514598
'x': 6.5, 'y': '2009.03.31 00.00.00', 'val': -0.9944031641204935
'x': 6.5, 'y': '2009.04.30 00.00.00', 'val': 0.4910807257668136
'x': 6.5, 'y': '2009.05.31 00.00.00', 'val': 1.5922216407449592
'x': 6.5, 'y': '2009.06.30 00.00.00', 'val': -0.41559207408354637

【讨论】:

以上是关于使用 xarray 选择所有坐标值的主要内容,如果未能解决你的问题,请参考以下文章

GUI坐标值范围设置

求助大神,怎么去掉echarts中y轴,但是保留y轴坐标值和网格线

java编程 怎样动态的把产生出来的坐标值存到数组当中?

C语言求出平面坐标系中任意两点间的距离.点的信息(x坐标值,y坐标值,全为整数)通

leetcode每日一题找到第K大的异或坐标值

leetcode1738. 找出第 K 大的异或坐标值