如何将多个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.csv
和 data.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_id
和 date
?
我尝试了以下代码
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
将所有df
s 沿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 数据框中,文件名作为行名?