【问题标题】:trouble looping xarray dataframe through subdirectories麻烦通过子目录循环 xarray 数据帧
【发布时间】:2019-05-06 07:32:23
【问题描述】:

我正在尝试通过循环遍历子目录来制作大数据框。我想:

i) 从子目录中的所有文件(扩展名为 .nc)中读取数据, ii) 选择其中的一个特定部分 iii) 将其保存在 output.nc 文件中。

import os
import xarray as xr
import numpy as np

rootdir ='/Users/sm/Desktop/along_track_J2'

data_new=[]

for subdir, dirs, files in os.walk(rootdir):

    for file in files:

        file_name= os.path.join(subdir, file)  

        df=xr.open_dataset(file_name)

        df['longitude'] = ((df.longitude + 180) % 360 - 180).sortby(df.longitude)

        ds=df.where((df.longitude>=-65) & (df.longitude<=-45) & (df.latitude>55), drop=True)

        data_new.append(ds)

xarray 不知何故无法读取文件,我看到以下错误:

文件“”,第 1 行,在 runfile('/Users/sm/Desktop/jason2_processing.py', wdir='/Users/sm/Desktop')

文件“/Users/sm/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,第 668 行,在运行文件中 execfile(文件名,命名空间)

文件“/Users/sm/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,第 108 行,在 execfile exec(编译(f.read(),文件名,'exec'),命名空间)

文件“/Users/sm/Desktop/jason2_processing.py”,第 18 行,在 df=xr.open_dataset(file_name)

文件“/Users/sm/anaconda3/lib/python3.7/site-packages/xarray/backends/api.py”,第 320 行,在 open_dataset **backend_kwargs)

文件“/Users/sm/anaconda3/lib/python3.7/site-packages/xarray/backends/netCDF4_.py”,第 331 行,打开 ds = opener()

文件“/Users/sm/anaconda3/lib/python3.7/site-packages/xarray/backends/netCDF4_.py”,第 230 行,在 _open_netcdf4_group ds = nc4.Dataset(filename, mode=mode, **kwargs)

文件“netCDF4/_netCDF4.pyx”,第 2123 行,在 netCDF4._netCDF4.Dataset.init

文件“netCDF4/_netCDF4.pyx”,第 1743 行,在 netCDF4._netCDF4._ensure_nc_success 中

OSError:[Errno -51] NetCDF:未知文件格式:b'/Users/sm/Desktop/along_track_J2/.DS_Store'

谁能帮我解决这个问题。提前谢谢你。

【问题讨论】:

    标签: python loops python-xarray netcdf4


    【解决方案1】:

    OSError:[Errno -51] NetCDF:未知文件格式:b'/Users/sm/Desktop/along_track_J2/.DS_Store'

    您当前正在循环浏览所有文件、NetCDF 和其他(系统)文件。 .DS_store 是 macOS 创建的文件,不是 NetCDF 文件。如果你只想处理 NetCDF 文件,这样的事情应该可以工作:

    ...
    for file in files:
        if file.split('.')[-1] == 'nc':
            file_name= os.path.join(subdir, file) 
            df = xr.open_dataset(file_name)
            ....
    

    if file.split('.')[-1] == 'nc':(我唯一添加的)基本上检查文件扩展名是否为.nc,而忽略其他文件。

    【讨论】:

    • 很棒的方法。是否可以使用 files=glob.glob(subdir + "*.nc") 行中的某些内容来避免 if 循环?
    • 是的,我猜是这样,但除非您有数百(或更多)非 NetCDF 文件,否则如果它在性能上有任何差异,我会感到惊讶(如果这就是您所追求的?)
    猜你喜欢
    • 2020-04-03
    • 2021-06-15
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多