使用 xarray 将 netcdf 文件的一部分转换为数据帧

问题描述

我目前正在尝试将 netcdf 文件转换为数据帧。我正在使用以下数据: https://www.ufz.de/export/data/2/248980_SMI_SM_L02_Oberboden_monatlich_1951-2020_inv.nc

文件包含以下信息:

int32 时间(时间) 标准名称:时间 long_name:时间 单位:自 1951-01-16 00:00:00 以来的天数 日历:标准 轴:T 无限维度:时间 当前形状 = (840,) 填写 int32 东移(东移) 轴:X 无限维度: 当前形状 = (175,) 填写 int32 北向(北向) 轴:Y 无限维度: 当前形状 = (225,) 填写 float32 SMI(时间,北距,东距) long_name:土壤水分指数 单位: - _FillValue:-9999.0 缺失值:-9999.0 无限维度:时间 当前形状 = (840,225,175) 填写 float64 lat(北向,东向) long_name:纬度 单位:度_北 _FillValue:-9999.0 缺失值:-9999.0 无限维度: 当前形状 = (225,175) 填写 float64 lon(北向,东向) long_name:经度 单位:度_东 _FillValue:-9999.0 缺失值:-9999.0 无限维度: 当前形状 = (225,175) 补完

我的目标是过滤 SMI 值(还包含时间、北距、东距信息)并将它们转换为数据框。

我目前的代码如下:

import os
from matplotlib import pyplot as plt
import pandas as pd
import netCDF4
import numpy as np
import xarray as xr

# Define directory
os.chdir('C:/Users/Documents/Project/climateRisks')

dp = xr.open_dataset('SMI_Oberboden.nc')
dp = dp.SMI


m2 = dp.to_dataframe()
m2 = m2.dropna()
print(m2.head(15))

结果如下:

                                  SMI
time       northing easting          
1951-01-16 5238000  4360000  0.445849
                    4364000  0.473440
                    4368000  0.309218
           5242000  4364000  0.365326
                    4368000  0.426184
                    4372000  0.344188
                    4376000  0.284556
           5246000  4364000  0.390772
                    4368000  0.521810
                    4372000  0.586828
                    4376000  0.344797
                    4380000  0.394820
           5250000  4356000  0.470163
                    4360000  0.619951
                    4364000  0.540267

问题是最终的数据框只有一列 (SMI),而其余的(时间、北距、东距)不被视为列。我的目标是最终有四列(时间、北距、东距、SMI)。由于我对此还很陌生,因此非常感谢您的帮助。

解决方法

您只需要重置索引。所以将倒数第二行改为:

m2 = m2.dropna().reset_index()