【问题标题】:Convert time series data from csv to netCDF python将时间序列数据从 csv 转换为 netCDF python
【发布时间】:2019-10-11 02:05:44
【问题描述】:

这个过程中的主要问题是下面的代码:

precip[:] = orig

产生以下错误:

ValueError: cannot reshape array of size 5732784 into shape (39811,144,144)

我有两个 CSV 文件,一个 CSV 文件包含一个变量(降水)的所有实际数据,每列作为一个站点,它们对应的坐标在第二个单独的 CSV 文件中。 我的样本数据在google drive here

如果您想查看数据本身,但我的第一个 CSV 文件的形状为 (39811, 144) 而第二个 CSV 文件的形状为 (171, 10) 但请注意;我只将切片数据框用作 (144, 2)。

这是代码:

stations = pd.read_csv(stn_precip)
stncoords = stations.iloc[:,[0,1]][:144]
orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])

lons = stncoords['X']
lats = stncoords['Y']

ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')

ncout.createDimension('longitude',lons.shape[0])
ncout.createDimension('latitude',lats.shape[0])
ncout.createDimension('precip',orig.shape[1])
ncout.createDimension('time',orig.shape[0])

lons_out = lons.tolist()
lats_out = lats.tolist()
time_out = orig.index.tolist()

lats = ncout.createVariable('latitude',np.dtype('float32').char,('latitude',))
lons = ncout.createVariable('longitude',np.dtype('float32').char,('longitude',))
time = ncout.createVariable('time',np.dtype('float32').char,('time',))
precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'longitude','latitude'))

lats[:] = lats_out
lons[:] = lons_out
time[:] = time_out
precip[:] = orig
ncout.close()

我的代码主要基于这篇文章:convert-csv-to-netcdf 但不包括变量“时间”作为第三维,所以这就是我失败的地方。 我想我应该期望降水变量具有 (39811, 144, 144) 形式的形状,但错误表明并非如此。

不完全确定如何处理此问题,欢迎提出任何意见。

【问题讨论】:

    标签: python pandas csv netcdf netcdf4


    【解决方案1】:

    由于您有来自不同站点的数据,我建议您对 netCDF 文件使用维度 station,而不是将 lonlat 分开。当然,您可以将每个站点的经纬度保存到单独的变量中。

    以下是一种可能的解决方案,以您的代码为例:

    #!/usr/bin/env ipython
    import pandas as pd
    import numpy as np
    import netCDF4
    
    stn_precip='Precip_1910-2018_stations.csv'
    orig_precip='Precip_1910-2018_origvals.csv'
    stations = pd.read_csv(stn_precip)
    stncoords = stations.iloc[:,[0,1]][:144]
    orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])
    
    lons = stncoords['X']
    lats = stncoords['Y']
    nstations = np.size(lons)
    
    ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')
    
    ncout.createDimension('station',nstations)
    ncout.createDimension('time',orig.shape[0])
    
    lons_out = lons.tolist()
    lats_out = lats.tolist()
    time_out = orig.index.tolist()
    
    lats = ncout.createVariable('latitude',np.dtype('float32').char,('station',))
    lons = ncout.createVariable('longitude',np.dtype('float32').char,('station',))
    time = ncout.createVariable('time',np.dtype('float32').char,('time',))
    precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'station'))
    
    lats[:] = lats_out
    lons[:] = lons_out
    time[:] = time_out
    precip[:] = orig
    ncout.close()
    

    所以关于输出文件(ncdump -h Precip_1910-2018_homomod.nc)的信息是这样的:

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 2019-09-20
      • 2014-05-20
      • 2018-10-04
      • 2018-12-24
      • 2015-02-02
      • 1970-01-01
      • 2016-01-02
      • 2018-05-10
      相关资源
      最近更新 更多