【问题标题】:NetCDF get_dims too many values to unpackNetCDF get_dims 太多值无法解包
【发布时间】:2021-02-10 00:32:19
【问题描述】:

我正在使用 NetCDF 文件 (.nc) - 600+MB。

import netCDF4
from netCDF4 import num2date
import numpy as np
import os
import pandas as pd

# Open netCDF4 file
file_location = '2m dewpoint temperature.nc'
f = netCDF4.Dataset(file_location)

为了将文件转换为 CSV,我首先找到了它的属性

# Find the attributes
print(f.variables.keys())

Output: dict_keys(['longitude', 'latitude', 'expver', 'time', 'd2m'])

然后,提取变量并尝试获取尺寸时

# Extract variable
d2m = f.variables['d2m']
 
# Get dimensions
time_dim, lat_dim, lon_dim = d2m.get_dims()
time_var = f.variables[time_dim.name]
times = num2date(time_var[:], time_var.units)
latitudes = f.variables[lat_dim.name][:]
longitudes = f.variables[lon_dim.name][:]

我收到以下错误

time_dim, lat_dim, lon_dim = d2m.get_dims()
ValueError:要解压的值太多(预计 3 个)

这里发生了什么,我应该如何解决?


编辑 1

print(d2m.get_dims()) 的输出是

(<class 'netCDF4._netCDF4.Dimension'>: name = 'time', size = 94750, <class 'netCDF4._netCDF4.Dimension'>: name = 'expver', size = 2, <class 'netCDF4._netCDF4.Dimension'>: name = 'latitude', size = 33, <class 'netCDF4._netCDF4.Dimension'>: name = 'longitude', size = 53)

编辑 2

df.head()@RobertWilson's suggestion

【问题讨论】:

    标签: python pandas export-to-csv netcdf netcdf4


    【解决方案1】:

    您的维度似乎超过 3 个。因此这应该失败:

    time_dim, lat_dim, lon_dim = d2m.get_dims()
    

    您只需要检查d2m.get_dims() 为您提供的内容,然后修改该行。

    转换为 csv 的更快方法是使用 xarray:

    import xarray as xr
    import pandas as pd
    ds = xr.open_dataset(file_location)
    df = ds.to_dataframe().reset_index()
    # subset the dataframe etc.    
    df.to_csv(filename, index=False)
    

    【讨论】:

    • 谢谢你,already solved it。您的解决方案,经过一些调整,也可能有效。对于 d2m.get_dims() 输出,请检查问题中的 Edit 1。至于您建议转换为 csv 的方式,df 给了我以下错误MemoryError: Unable to allocate 2.47 GiB for an array with shape (331435500,) and data type int64。我在没有.reset_index() 之前尝试了一个类似的样本,输出是一个大小为 (33145500, 1) 的 df,它太大而无法在本地打开。检查 df.head() 的编辑 2。
    • 看起来是 RAM 问题。解包的数据可能比您需要的多。但是,如果您有解决方案,请永远不要寻找更简单的解决方案...
    【解决方案2】:

    作为@user2856 said,我得到了元组解包代码所期望的暗淡数量。

    为了得到适量的暗淡,我跑了

    print(d2m.get_dims())
    

    输出是

    (<class 'netCDF4._netCDF4.Dimension'>: name = 'time', size = 94750, <class 'netCDF4._netCDF4.Dimension'>: name = 'expver', size = 2, <class 'netCDF4._netCDF4.Dimension'>: name = 'latitude', size = 33, <class 'netCDF4._netCDF4.Dimension'>: name = 'longitude', size = 53)
    

    因此我只是调整了出错的行

    time_dim, expver_dim, lat_dim, lon_dim = d2m.get_dims()
    

    然后一切顺利,包括转换为 .CSV。

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多