You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将含x、y列与变量A的DataFrame转换为无重复维度的NetCDF文件

问题:将二维表格数据转换为无重复维度的NetCDF文件

我的数据结构简化后如下:

  • x = [1,1,2,2,3,3,4,4,...n,n]
  • y = [1,2,1,2,1,2,1,2,...1,2]
  • A = [7,5,6,5,4,6,2,5,...4,3]

这是二维数据,变量A的每个值对应同一行的x、y坐标,数据读取顺序为:从x=1、y=1开始,遍历完y的所有值后,再取x=2,遍历y从1到最大值,以此类推。我将这些数据存储为包含x、y、A三列的DataFrame,但直接使用Data.to_netcdf("filename.nc")转换为NetCDF时,会生成大量重复的x、y变量——维度被设为从1到n的索引。例如x实际只有5个唯一值,但转换后的NetCDF里会有15个x值(每个x重复y次),y坐标同理。

我需要生成的NetCDF中,A作为变量,x、y作为无重复的维度。真实数据集包含上百个x值和近百个y值,每个x会重复y次,每个y也对应所有x值。


原始数据处理代码

import pandas as pd

S_2017 = pd.read_csv("S_2017.csv")

EachValue = []
for i in range(124):
    Lon_min = 19.3 + i*0.1
    Lon_max = Lon_min + 0.1
    for j in range(45):
        S_2017_Analyze = S_2017
        Lat_max = 64.2 - j*0.1
        Lat_min = Lat_max - 0.1
        S_2017_Analyze = S_2017_Analyze[S_2017_Analyze.iloc[:,1] >= Lon_min]
        S_2017_Analyze = S_2017_Analyze[S_2017_Analyze.iloc[:,1] <= Lon_max]
        S_2017_Analyze = S_2017_Analyze[S_2017_Analyze.iloc[:,2] >= Lat_min]
        S_2017_Analyze = S_2017_Analyze[S_2017_Analyze.iloc[:,2] <= Lat_max]
        S_Sum_2017 = S_2017_Analyze.iloc[:,3].sum()
        Pixel_S_2017 = [round(Lat_min,2),round(Lon_min,2),S_Sum_2017]
        EachValue.append(Pixel_S_2017)
DataFrame = pd.DataFrame(EachValue,columns=["Latitude","Longitude","S_Sum_2017"])

解决方案代码

使用xarray库可以直接将带坐标列的DataFrame转换为具有无重复维度的NetCDF文件:

import xarray as xr 

# 基于生成的DataFrame整理列名(确保对应纬度、经度、目标变量)
processed_df = pd.DataFrame({'Latitude': DataFrame['Latitude'],
                             'Longitude': DataFrame['Longitude'],
                             'S_Sum_2017': DataFrame['S_Sum_2017']
                            })
# 将纬度和经度设置为索引,转换为xarray Dataset后保存为NetCDF
xr.Dataset.from_dataframe(processed_df.set_index(["Latitude","Longitude"])).to_netcdf("S_2017.nc")

内容的提问来源于stack exchange,提问作者jugimanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:44:50