Xarray:将多个 CSV 文件加载到数据集中

2023-11-30

我有几个逗号分隔的数据文件,我想将它们加载到 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

Edit

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

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

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.Datasets.

这样你就可以使用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

然后得到最大值std over time:

ds_full.std("time").max()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xarray:将多个 CSV 文件加载到数据集中 的相关文章

随机推荐

  • 当 SimpleXML 解析带有特殊字符的 XML 时会发生什么?

    我正在尝试用我的最终输出来解决这个问题 XML 提要看起来像这样
  • UIView动画

    我正在尝试制作动画UIView这里 它看起来像一个矩形 我只想将其转换为我的坐标 那么 我怎样才能让它动起来呢 我试图找到一些教程 但没有成功 在iOS 4中 UIView块动画方法是最简单的 UIView animateWithDurat
  • 什么是 JSTL 强制 Jars

    我是新人 刚刚开始学习Java 来自jstltag 我对jstl了解很多 我使用IDE eclipse mars 通过添加一个简单的jsp页面来创建一个动态Web项目 然后将war导出到tomcat 7的webapps文件夹中 我对jstl
  • Leaflet - 如何查找现有标记并删除标记?

    我已经开始使用传单作为开源地图 http leaflet cloudmade com 以下 jQuery 代码将允许在单击地图时在地图上创建标记 map on click onMapClick function onMapClick e v
  • 向表单验证添加错误不起作用?

    根据有关表单验证的语义 UI 文档 我可以手动添加错误 添加错误 错误 给定数组错误 将错误添加到表单中 我想使用此功能 因为我通过 AJAX 提交表单 进行服务器端验证 然后想要显示结果 我尝试了以下代码 my form form add
  • spring默认作用域是否是单例?

    你能解释一下为什么Spring要为如下所示的bean配置创建两个对象吗 因为默认情况下spring的默认作用域是单例的 Spring的配置在这里
  • 寻找具有 3 个 CGPoint 的角度

    在我的应用程序中 用户点击 3 次 点击的 3 个点将创建一个角度 它完美地绘制了角度 我试图计算第二次点击时的角度 但我认为我做错了 可能是数学错误 我还没有在微积分课上讨论这个问题 所以我将使用维基百科上的公式 http en wiki
  • 无法从派生类型的范围访问另一个实例的受保护成员

    In 这个答案对于这个问题 为什么我的对象无法访问公共基类中定义的另一个对象的受保护成员 可以读作 您只能从您自己的基类实例访问受保护的成员 要么我没有正确理解 要么关注 MCVE 在 coliru 上直播 证明它是错误的 struct B
  • Android 上是否有类似于 Windows Phone 7 上的全景或枢轴 UI 控件?

    有谁知道是否有一个适用于 Android 的 UI 小部件 类似于 Windows Phone 7 全景或枢轴控件 如果没有 是否有任何教程可以指导我走上实现自己的正确道路 任何帮助表示赞赏 谢谢 是的 我也对枢轴控件感兴趣 这是我找到的类
  • 避免 GRPC 服务器中的端口冲突

    我目前正在考虑 GRPC 来满足我的实时需求 我注意到在示例中我们明确要求绑定到服务器中的硬编码端口 我希望将服务器部署在像 Heroku 这样的 Stack 上 想象一下 我将端口设置为 9090 并且该端口当前正被另一个服务使用 这不会
  • R:每月汇总行数

    我制作了一个数据框 其中有一列包含日期和一列包含数值 我希望这个数据框按月进行分组 并汇总每个相应月份其他列中的所有数值 这是我的数据框示例 capture date Test1 Test2 Test3 2016 03 18 0 1 1 2
  • 如何在 Vue 2 中包含 css 文件

    我是 vue js 新手 正在尝试学习这个 我在我的系统中安装了全新版本的 vue webpack 我有一个 css js 和这个主题模板的图像 我想将其包含到 HTML 中 所以我尝试将其添加到index html但我可以在控制台中看到错
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 从任何进程获取密钥

    我在网上看到了很多解决方案 但没有一个完全符合我的要求 当我的应用程序在后台运行时 在给定进程 不是我的控制台应用程序 中按下任何键的最佳 最简单方法是什么 我不需要修改器或任何东西 如果您不太关心按下哪个进程 最简单的方法是调用获取异步键
  • 删除异常值 (+/- 3 std) 并替换为 Python/pandas 中的 np.nan

    我看到了几种接近解决我的问题的解决方案 link1 link2 但到目前为止 他们还没有帮助我取得成功 我相信以下解决方案是我所需要的 但仍然出现错误 并且我没有声誉点对其进行评论 提问 link 我收到以下错误 但我不明白在哪里 copy
  • 如何在android中创建像Iphone Edittext框一样的渐变

    这是一个例子iPhone EditText控制 如何在 Android 中创建相同的控件 基本上 我看到三种方式做你想做的事 第一种方法 第一个是 如阿基 说 制作一个 9 补丁 精确复制您要使用的渐变填充框 未指定的其他平台 这可以让您的
  • 如何将 Google Actions 响应集成到 Dialogflow 中的 Webhook 响应中?

    我正在尝试找出如何嵌入 Google Actions 响应 例如卡片轮播 在 DialogFlow 的 Webhook 响应中 On https developers google com actions dialogflow webhoo
  • Hibernate 抛出 SQLException 无法重置阅读器

    java sql SQLException could not reset reader at org hibernate lob ClobImpl getCharacterStream ClobImpl java 100 at org h
  • Python+Tkinter,如何在独立于tk前端的后台运行?

    我是一个 tkinter 菜鸟 在后台运行长时间运行的进程 与我的 tkinter 弹出窗口 表单 分开 的首选方式是什么 我在使用 tkinter 时阅读了有关多线程的不同内容 但找不到简单的 这样做 需要明确的是 我需要的行为是 用户启
  • Xarray:将多个 CSV 文件加载到数据集中

    我有几个逗号分隔的数据文件 我想将它们加载到 xarray 数据集中 每个文件中的每一行代表固定网格中字段的不同空间值 每个文件代表不同的时间点 网格间距是固定的 不随时间变化 网格的间距不均匀 最终目标是计算max x y std t v