如何将多个csv连接到xarray并定义坐标?

Posted

技术标签:

【中文标题】如何将多个csv连接到xarray并定义坐标?【英文标题】:How to concatenate multiple csv to xarray and define coordinates? 【发布时间】:2020-02-09 23:31:15 【问题描述】:

我有多个 csv 文件,具有相同的行和列,并且它们包含的数据因日期而异。每个 csv 文件都附属于不同的日期,在其名称中列出,例如data.2018-06-01.csv。我的数据的一个最小示例如下所示:我有两个文件,data.2018-06-01.csvdata.2019-06-01.csv,分别包含

user_id, weight, status
001, 70, healthy
002, 90, healthy 

user_id, weight, status
001, 72, healthy
002, 103, obese

我的问题:如何将 csv 文件连接到 xarray 并定义 xarray 的坐标为 user_iddate

我尝试了以下代码

df_all = [] 
date_arr = []

for f in [`data.2018-06-01.csv`, `data.2019-06-01.csv`]:
  date = f.split('.')[1]
  df = pd.read_csv(f)
  df_all.append(df)
  date_arr.append(date)

x_arr = xr.concat([df.to_xarray() for df in df_all], coords=[date_arr, 'user_id'])

但是coords=[...] 会导致错误。我能做什么?谢谢

【问题讨论】:

【参考方案1】:

回想一下,尽管它在原始NumPy 类数组之上引入了维度、坐标和属性形式的标签,但xarray 的灵感来自pandas,并大量借鉴了pandas。所以,要回答这个问题,您可以按照以下步骤进行。

from glob import glob
import numpy as np
import pandas as pd

# Get the list of all the csv files in data path
csv_flist = glob(data_path + "/*.csv") 

df_list = []
for _file in csv_flist:
    # get the file name from the data path
    file_name = _file.split("/")[-1]
    
    # extract the date from a file name, e.g. "data.2018-06-01.csv"
    date = file_name.split(".")[1]
    
    # read the read the data in _file
    df = pd.read_csv(_file)
    
    # add a column date knowing that all the data in df are recorded at the same date
    df["date"] = np.repeat(date, df.shape[0])
    df["date"] = df.date.astype("datetime64[ns]") # reset date column to a correct date format
    
    # append df to df_list
    df_list.append(df)

让我们检查一下df_list中的第一个df

print(df_list[0])

    status  user_id  weight       date
0  healthy        1      72 2019-06-01
1    obese        2     103 2019-06-01

将所有dfs 沿axis=0 连接起来

df_all = pd.concat(df_list, ignore_index=True).sort_index()
print(df_all)

    status  user_id  weight       date
0  healthy        1      72 2019-06-01
1    obese        2     103 2019-06-01
2  healthy        1      70 2018-06-01
3  healthy        2      90 2018-06-01

df_all的索引设置为levels[0] = "date"levels[1]="user_id"两级的multiIndex。

data = df_all.set_index(["date", "user_id"]).sort_index()
print(data)

                     status  weight
date       user_id                 
2018-06-01 1        healthy      70
           2        healthy      90
2019-06-01 1        healthy      72
           2          obese     103

随后,您可以使用.to_xarray() 将生成的pandas.DataFrame 转换为xarray.Dataset,如下所示。

xds = data.to_xarray()
print(xds)

<xarray.Dataset>
Dimensions:  (date: 2, user_id: 2)
Coordinates:
  * date     (date) datetime64[ns] 2018-06-01 2019-06-01
  * user_id  (user_id) int64 1 2
Data variables:
    status   (date, user_id) object 'healthy' 'healthy' 'healthy' 'obese'
    weight   (date, user_id) int64 70 90 72 103

这将完全回答问题。

【讨论】:

谢谢!我不再从事这项任务,需要深入研究我的旧代码来测试你的建议,不幸的是我没有时间去做。但如果我将来碰巧这样做,我会接受你的答案作为我问题的正确答案!【参考方案2】:

试试这些:

    import glob
    import pandas as pd

    path=(r'ur file')
    all_file = glob.glob(path + "/*.csv")
    li = []
    for filename in all_file:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)
    frame = pd.concat(li, axis=0, ignore_index=True)

【讨论】:

能否在代码中包含一个简短的解释?

以上是关于如何将多个csv连接到xarray并定义坐标?的主要内容,如果未能解决你的问题,请参考以下文章

xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标

如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?

GlobalMapper精品教程023:Excel数据通过相同字段连接到属性表中(气温降水连接到气象台站)

如何获取用户指向的 GPS 坐标?

使用 xarray 更改坐标系以进行切片操作

如何在xarray中删除一个维度? [复制]