将 pandas 数据帧转换为 xarray 数据集

converting pandas dataframe to xarray dataset

   Unnamed: 0       index    datetime  ...   cVI     Reg       average_temp
0           0  2000-01-01  2000-01-01  ...   NaN  Central           -5.883996
1           1  2000-01-02  2000-01-02  ...   NaN  Central           -6.715087
2           2  2000-01-03  2000-01-03  ...   NaN  Central           -6.074254
3           3  2000-01-04  2000-01-04  ...   NaN  Central           -4.222387
4           4  2000-01-05  2000-01-05  ...   NaN  Central           -0.994825

我想将上面的dataframe转换为一个xarray数据集,以datetime作为索引。我这样做:

ds = xr.Dataset.from_dataframe(df)

但我无法将 datetime 列作为索引。我该怎么做?

xarray 会将数据框中的索引视为结果数据集的维度。 MultiIndex 将被取消堆叠,这样每个级别将在结果中形成一个新的正交维度。

要将您的数据转换为 xarray,首先将日期时间设置为 pandas 中的索引,使用 df.set_index('datetime')

ds = df.set_index('datetime').to_xarray()

或者,您可以在之后使用 ds.set_coords('datetime') 对其进行推广,然后将索引维度与 ds.swap_dims:

交换
ds = df.to_xarray()
ds.set_coords('datetime').swap_dims({'index': 'datetime'})

我推荐第一个选项,但如果您已经将数据作为数据集并想要交换索引,则第二个选项也适用。

首先在所需列上使用 pd.to_datetime and df.set_index

df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')

#             cVI      Reg  average_temp
# datetime                              
# 2000-01-01  NaN  Central     -5.883996
# 2000-01-02  NaN  Central     -6.715087
# 2000-01-03  NaN  Central     -6.074254
# 2000-01-04  NaN  Central     -4.222387
# 2000-01-05  NaN  Central     -0.994825

然后您的 xr.Dataset.from_dataframe 代码将按预期工作:

ds = xr.Dataset.from_dataframe(df)

# <xarray.Dataset>
# Dimensions:       (datetime: 5)
# Coordinates:
#   * datetime      (datetime) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-05
# Data variables:
#     cVI           (datetime) float64 nan nan nan nan nan
#     Reg           (datetime) object 'Central' 'Central' ... 'Central' 'Central'
#     average_temp  (datetime) float64 -5.884 -6.715 -6.074 -4.222 -0.9948

或者如 Michael 所说,使用 df.to_xarray:

从 pandas 端转换它
ds = df.to_xarray()

# <xarray.Dataset>
# Dimensions:       (datetime: 5)
# Coordinates:
#   * datetime      (datetime) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-05
# Data variables:
#     cVI           (datetime) float64 nan nan nan nan nan
#     Reg           (datetime) object 'Central' 'Central' ... 'Central' 'Central'
#     average_temp  (datetime) float64 -5.884 -6.715 -6.074 -4.222 -0.9948