gpt4 book ai didi

python - X 阵列 : Loading several CSV files into a dataset

转载 作者:行者123 更新时间:2023-12-05 02:46:24 32 4
gpt4 key购买 nike

我有几个逗号分隔的数据文件,我想将它们加载到 xarray 数据集中。每个文件中的每一行代表固定网格中字段的不同空间值,每个文件代表不同的时间点。网格间距是固定的,不随时间变化。网格间距不均匀。最终目标是计算 max_{x, y} { std_t[ value(x, y, t) * sqrt(y **2 + x ** 2)] },其中 sqrt 是平方根,std_t 是相对于时间的标准偏差,max_{x, y} 是所有空间的最大值。

我在加载数据时遇到问题。我不清楚应该如何将多个 CSV 文件加载到 xarray 数据集中。有一个 open_mfdataset 函数,它是为将多个数据文件加载到数据集中而设计的,但似乎需要 hdf5 或 netcdf 文件。

似乎无法将常规 CSV 文件加载到 xarray 数据集中,并且有必要对数据进行预处理。在我的示例中,我决定预先将 csv 文件预处理为 hdf5 文件,以利用 h5netcdf 引擎。这对我来说似乎是一个特定于 hdf5 的问题。

下面是我迄今为止加载数据的最佳尝试。不幸的是,它会产生一个空的 xarray 数据集。我在open_mfdataset 函数中尝试了几个选项,下面的代码只是多次尝试使用该函数的一种实现。

我如何将这些 csv 文件加载到单个 xarray 数据集中,以设置自己以找到感兴趣值的时间标准偏差的最大跨空间?

import xarray as xr
import numpy as np
import pandas as pd

'''
Create example files
- Each file contains a spatial-dependent value, f(x, y)
- Each file represents a different point in time, f(x, y, t)

'''
for ii in range(7):

# create csv file
fl = open('exampleFile%i.dat' % ii, 'w')
fl.write('time x1 x2 value\n')
for xx in range(10):
for yy in range(10):
fl.write('%i %i %i %i\n' %
(ii, xx, yy, (xx - yy) * np.exp(ii)))
fl.close()

# convert csv to hdf5
dat = pd.read_csv('exampleFile%i.dat' % ii)
dat.to_hdf('exampleFile%i.hdf5' % ii, 'data', mode='w')

'''
Read all files into xarray dataframe
(the ultimate goal is to find the
maximum across time of
the standard deviation across space
of the "value" column)
'''
result = xr.open_mfdataset('exampleFile*.hdf5', engine='h5netcdf', combine='nested')

...当我运行代码时,result 变量似乎不包含所需的数据:

In: result
Out:
<xarray.Dataset>
Dimensions: ()
Data variables:
*empty*
Attributes:
PYTABLES_FORMAT_VERSION: 2.1
TITLE: Empty(dtype=dtype('S1'))
VERSION: 1.0

编辑

发布的答案假设空间网格均匀分布。这是一个稍微修改过的示例,它不假设空间点的网格是均匀分布的。

该示例还假设了三个空间维度。这更符合我的实际问题,我意识到这可能是这个简单示例中的一个重要细节。

import xarray as xr
import numpy as np
import pandas as pd

'''
Create example files
- Each file contains a spatial-dependent value, f(x, y)
- Each file represents a different point in time, f(x, y, t)

'''
for ii in range(7):

# create csv file
fl = open('exampleFile%i.dat' % ii, 'w')
fl.write('time x y z value\n')
for xx in range(10):
for yy in range(int(10 + xx // 2)):
for zz in range(int(10 + xx //3 + yy // 3)):
fl.write('%i %f %f %f %f\n' %
(ii, xx * np.exp(- 1 * yy * zz) , yy * np.exp(xx - zz), zz * np.exp(xx * yy), (xx - yy) * np.exp(ii)))
fl.close()

# convert csv to hdf5
dat = pd.read_csv('exampleFile%i.dat' % ii)
dat.to_hdf('exampleFile%i.hdf5' % ii, 'data', mode='w')

'''
Read all files into xarray dataframe
(the ultimate goal is to find the
maximum across time of
the standard deviation across space
of the "value" column)
'''
result = xr.open_mfdataset('exampleFile*.hdf5', engine='h5netcdf', combine='nested')

最佳答案

我的方法是创建一个解析函数,将 CSV 转换为 xarray.Dataset

这样您就可以使用 xarray.concat 将它们组合成最终数据集,您可以在该数据集上执行计算。

以下适用于您的示例数据:

from glob import glob

def csv2xr(csv, sep=" "):

df = pd.read_csv(csv, sep)
x = df.x1.unique()
y = df.x2.unique()

pix = df.value.values.reshape(1, x.size, y.size)

ds = xr.Dataset({
"value": xr.DataArray(
pix,
dims=['time', 'x', 'y'],
coords={"time": df.time.unique(), "x": x, "y": y})
})

return ds

csvs = glob("*dat")

ds_full = xr.concat([csv2xr(x) for x in csvs], dim="time")

print(ds_full)

#<xarray.Dataset>
# Dimensions: (time: 7, x: 10, y: 10)
# Coordinates:
# * time (time) int64 4 3 2 0 1 6 5
# * x (x) int64 0 1 2 3 4 5 6 7 8 9
# * y (y) int64 0 1 2 3 4 5 6 7 8 9
# Data variables:
# value (time, x, y) int64 0 -54 -109 -163 -218 -272 ... 593 445 296 148 0

然后获取 stdtime 上的最大值:

ds_full.std("time").max()

关于python - X 阵列 : Loading several CSV files into a dataset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65490931/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com