Python读取nc格式的CSIF数据转成csv格式

1 下载安装netCDF4包

使用清华大学的镜像:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple netCDF4

2 编写程序

2.1 获取netCDF4文件的格式1

#一、加载包
from netCDF4 import Dataset
import numpy as np
import os


path = "F:\\OCO2.SIF.all.daily.2001.nc"
csv_path = "F:\\test.csv"
dst = Dataset(path, mode='r', format="netCDF4")

# 二、查看nc文件中包含了什么
print(dst)
运行结果:
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): lat(360), lon(720), doy(92)
    variables(dimensions): float32 lat(lat), float32 lon(lon), int16 doy(doy), float32 all_daily_sif(doy, lat, lon)
    groups: 

由上可见CSIF数据all_daily_sif是三维的,具体size为:
d o y ( 92 ) × l a t ( 360 ) × l o n ( 720 ) doy(92)\times lat(360)\times lon(720) doy(92)×lat(360)×lon(720)
由于CSIF时间分辨率是4天,所以doy维是92;空间分辨率是0.5°,所以lat是360,lon是720。

#三、使用variables.keys()获取每个变量名,使用variables[i].ncattrs()获取每个变量的属性名
print(dst.variables.keys())
for i in dst.variables.keys():
    print('%s: %s' % (i, dst.variables[i].ncattrs()))
运行结果是:
dict_keys(['lat', 'lon', 'doy', 'all_daily_sif'])
lat: ['units', 'standard_name', 'axis', 'long_name']
lon: ['units', 'standard_name', 'axis', 'long_name']
doy: []
all_daily_sif: ['missing_value']
#四、输出每个variables[i]的信息:
print(dst.variables.keys())
for i in dst.variables.keys():
    print(dst.variables[i])
    print('\n')
运行结果:
dict_keys(['lat', 'lon', 'doy', 'all_daily_sif'])
<class 'netCDF4._netCDF4.Variable'>
float32 lat(lat)
    units: degrees_north
    standard_name: latitude
    axis: Y
    long_name: latitude
unlimited dimensions: 
current shape = (360,)
filling on, default _FillValue of 9.969209968386869e+36 used

<class 'netCDF4._netCDF4.Variable'>
float32 lon(lon)
    units: degrees_east
    standard_name: longitude
    axis: X
    long_name: longitude
unlimited dimensions: 
current shape = (720,)
filling on, default _FillValue of 9.969209968386869e+36 used

<class 'netCDF4._netCDF4.Variable'>
int16 doy(doy)
unlimited dimensions: 
current shape = (92,)
filling on, default _FillValue of -32767 used

<class 'netCDF4._netCDF4.Variable'>
float32 all_daily_sif(doy, lat, lon)
    missing_value: -999.9
unlimited dimensions: 
current shape = (92, 360, 720)
filling on, default _FillValue of 9.969209968386869e+36 used

#五、获取所有维度的size大小并输出
for i in dst.dimensions.keys():
    print('%s_sizes: %s' % (i, dst.dimensions[i].size))
运行结果:
lat_sizes: 360
lon_sizes: 720
doy_sizes: 92

2.2 提取nc数据转存为csv23

# 从cn文件中获取所有的sif、lat、lon值
    IniSif = dst.variables['all_daily_sif'][:].data    
    latdata = dst.variables['lat'][:].data
    londata = dst.variables['lon'][:].data
    
    # 确定行索引名和列索引名,与xy轴方向一致,lat为行索引
    latname = []    
    lonname = []
    for lat in range(0, 360):
        latname.append(str(latdata[lat]))
    for lon in range(0, 720):
        lonname.append(str(londata[lon]))
    
    # 将sif值转换为表格dataframe格式
    sif = IniSif[0][:]
    sifframe = pd.DataFrame(sif, index=latname, columns=lonname)
    for doy in range(1,92):
        # 下面获得第doy天的所有sif
        sif = IniSif[doy][:]
        # 下面将第doy天的sif加上行列索引信息变成表格
        siflist = pd.DataFrame(sif,index = latname,columns =lonname)
        # 下面将已经生成表格合并
        sifframe = pd.concat([sifframe, siflist])

    sifframe.to_csv(csv_path,sep=',')
    dst.close()
        

生成csv文件如下图所示,列索引为lon值,行索引为lat值:
生成csv文件截图,行列索引分别为lat值和l哦那值


  1. 参考文献:https://blog.csdn.net/ch206265/article/details/103779013 ↩︎

  2. 参考文献:https://www.cnblogs.com/android-16/p/11131901.html ↩︎

  3. 参考文献:https://zhuanlan.zhihu.com/p/129351199 ↩︎

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值