【问题标题】:Converting 3D xarray dataset to dataframe将 3D xarray 数据集转换为数据框
【发布时间】:2022-06-15 02:32:19
【问题描述】:

我已经导入了一个这样的 xarray 数据集,并从 csv 文件中提取了由区域定义的坐标处的值,以及由日期范围定义的时间段((经纬度)网格的 30 天,其中包含一些环境值每个坐标)。

from xgrads import open_CtlDataset
ds_Snow = open_CtlDataset(path + 'file')
ds_Snow = ds_Snow.sel(lat = list(set(zones['lat'])), lon = list(set(zones['lon'])), 
time = period, method = 'nearest')

当我查找 ds_Snow 的信息时,这是我得到的:

Dimensions:  (lat: 12, lon: 12, time: 30)
Coordinates:
  * time     (time) datetime64[ns] 2000-09-01 2000-09-02 ... 2000-09-30
  * lat      (lat) float32 3.414e+06 3.414e+06 3.414e+06 ... 3.414e+06 3.414e+06
  * lon      (lon) float32 6.873e+05 6.873e+05 6.873e+05 ... 6.873e+05 6.873e+05
Data variables:
    spre     (time, lat, lon) float32 dask.array<chunksize=(1, 12, 12), meta=np.ndarray>
Attributes:
    title:    SnowModel
    undef:    -9999.0 type : <class 'xarray.core.dataset.Dataset'>

我想让它成为一个数据框,尊重初始维度(时间、纬度、经度)。 所以我这样做了:

df_Snow = ds_Snow.to_dataframe()

但这里是数据框的尺寸:

print(df_Snow)
lat       lon        time            
3414108.0 687311.625 2000-09-01   0.0
                     2000-09-02   0.0
                     2000-09-03   0.0
                     2000-09-04   0.0
                     2000-09-05   0.0
...                               ...
                     2000-09-26   0.0
                     2000-09-27   0.0
                     2000-09-28   0.0
                     2000-09-29   0.0
                     2000-09-30   0.0

[4320 rows x 1 columns]

看起来所有数据都放在了一个列中。 正如一些文档所解释的那样,我已经尝试给出尺寸订单:

df_Snow = ds_Snow.to_dataframe(dim_order = ['time', 'lat', 'lon'])

但它并没有改变任何东西,我似乎无法在论坛或文档中找到答案。我想知道一种将数组配置保留在数据框中的方法。

编辑:我找到了解决方案

我没有转换 xarray,而是选择使用每个属性的 pd.Series 来构建我的数据框,如下所示:

ds_Snow = ds_Snow.sel(lat = list(set(station_list['lat_utm'])),lon = list(set(station_list['lon_utm'])), time = Ind_Run_ERA5_Land, method = 'nearest')
time = pd.Series(ds_spre.coords["time"].values)
lon = pd.Series(ds_spre.coords["lon"].values)
lat = pd.Series(ds_spre.coords["lat"].values)
spre = pd.Series(ds_spre['spre'].values[:,0,0])
frame = { 'spre': spre, 'time': time, 'lon' : lon,  'lat' : lat}
df_Snow = pd.DataFrame(frame)

【问题讨论】:

    标签: python dataframe multidimensional-array dataset python-xarray


    【解决方案1】:

    这是预期的行为。来自the docs

    DataFrame 由索引坐标的笛卡尔积索引(以pandas.MultiIndex 的形式)。其他坐标作为列包含在 DataFrame 中。

    数据集中只有一个变量spre。其他属性,“坐标”已成为索引。由于有多个坐标(latlontime),DataFrame 有一个层次结构的MultiIndex

    您可以通过get_level_values 等工具获取索引数据,或者,如果您想更改DataFrame 的索引方式,可以使用reset_index()

    【讨论】:

    • 感谢您提供此信息。你知道如何将索引配置保留在原始数组数据集中的数据框中吗?
    • @CElise 我不确定我是否遵循。你的意思是你想要 DataFrame 中的底层 NumPy 数组索引?
    • 正如我所说,我正在使用 xarray(不确定它是否与 numpy 数组相同?),我想将它放入一个数据框中,对于每个 (lat,lon) 坐标,我将有一列包含 30 天的选定“spre”值(因此按 lon 和 lat 索引,然后是时间))。具有 360 行和 1 列的 df。抱歉,如果不清楚,我的英语可能会受到限制。
    • 您可以重新调整数据的形状,以便一个或多个维度出现在带有df_Snow.spre.unstack('time') 的列中。但是熊猫数据框本质上是二维的(或者,实际上是一维,变量/系列表示为统一类型的列)-如果您希望能够将纬度,经度和时间坐标保持为垂直维度,恐怕您要去必须留在 xarray :)
    • @CElise 老实说,我不会将此数据转换为 DataFrame。我认为xarray 已经做了你需要做的事情。它背后的想法基本上是为您提供 NumPy 索引(尝试索引到 ds_Snow['spre'](这是 DataArray,它就像一个 3D NumPy 数组,在每个轴上都有类似 Pandas 的索引)。但是 xarray 很棒,因为您也可以使用latlontime 来选择数据。它非常适合您的数据集。花几分钟时间on this tutorial 我认为它会开始有意义。
    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2020-11-03
    • 2021-01-22
    • 2017-10-24
    相关资源
    最近更新 更多