Я работаю с данными с координатной сеткой, в частности с данными netcdf, пытаясь найти максимальное значение точки сетки для наложения пикселей каждого файла netcdf в каталоге, игнорируя нулевые значения. Если вы знакомы с ArcGIS, это то же самое, что запустить максимальную функцию через Cell Statistics. Однако, когда я делаю это через xarray, я продолжаю получать сообщения об ошибках, говорящих о том, что функция, которую я вызываю, не существует или что данные не имеют атрибута, который я им присвоил.
Я нашел модуль в xarray , найденный здесь , и использовал пример в документации, который вызывает np.fmax, но я не смог заставить его работать. Я также пробовал xr.fmax и xr.ufuncs.fmax, но их, кажется, не существует.
Цель состоит в том, чтобы выполнить итерацию данных за 10 лет, сохранив максимальное количество еженедельных пакетов, а затем новый еженедельный набор данных, найти максимальное, среднее значение и количество значений, отличных от nan. Поэтому, если кто-нибудь знает о каких-либо других модулях, которые могут запускать указанную статистику, он был бы очень признателен.
Ниже приведен пример того, как я все настраивал:
import numpy as np
import xarray as xr
import rioxarray as rio
import os
# Directory that stores all the netcdf files
filepath = 'weekBatch/'
# Putting each file into its own xarray dataset
tot_files = 0
for filename in os.listdir(filepath):
tot_files += 1
ds = xr.open_dataset(filepath + filename)
# MESH is the value I'm trying to do math on
exec('ds_ge_0_' + str(tot_files) + ' = ds.where(ds.MESH >= 0.0)')
exec('ds_ge_15_' + str(tot_files) + ' = ds.where(ds.MESH >= 15.0)')
Вот пример того, как выглядит один набор данных:
>>> print(ds_ge_0_1.MESH)
<xarray.DataArray 'MESH' (latitude: 3501, longitude: 7001)>
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]])
Coordinates:
* longitude (longitude) float64 -130.0 -130.0 -130.0 ... -60.02 -60.01 -59.99
* latitude (latitude) float64 55.01 54.99 54.98 54.97 ... 20.02 20.01 20.0
Затем я пытаюсь запустить следующий блок...
for i in range(tot_files - 1):
ds1 = exec('ds_ge_0_' + str(i+1))
ds2 = exec('ds_ge_0_' + str(i+2))
ds_ge_0_final = np.fmax(ds1, ds2)
и получите следующую ошибку:
Traceback (most recent call last):
File "D:\xarray_stuff\DataProcess.py", line 287, in <module>
ds_ge_0_final = np.fmax(ds1, ds2)
TypeError: '>=' not supported between instances of 'NoneType' and 'NoneType'
Я использовал np.fmax, потому что нашел модуль в xarray нашел здесь, но не смог заставить его работать. Я также пробовал xr.fmax и xr.ufuncs.fmax, но их, кажется, не существует.
ну, я получаю из этого xr.DataArray. Проверьте оператор print(ds_ge_0_1), потому что он возвращает нужные мне данные. В конце концов я собирался поместить его в список, но я не уверен, как добавить наборы данных xarray в список прямо сейчас. Это просто цыплячьи царапины прямо сейчас. Основная цель - заставить работать функцию fmax.
Ключевой вывод таков: когда вы достигаете exec
, ВСЕГДА есть лучший способ сделать это.
Вот безопасный способ обработки этих данных:
import numpy as np
import os
# Directory that stores all the netcdf files
filepath = 'weekBatch/'
# Putting each file into its own xarray dataset
ds_ge_0 = []
ds_ge_15 = []
for filename in os.listdir(filepath):
ds = xr.open_dataset(filepath + filename)
ds_ge_0.append( ds.where(ds.MESH >= 0.0) )
ds_ge_15.append( ds.where(ds.MESH >= 15.0) )
print(ds_ge_0[0].MESH)
# finds the max of all the datasets in ds_ge_0
for i in range(len(ds_ge_0) - 1):
ds1 = ds_ge_0[i]
ds2 = ds_ge_0[i+1]
ds_ge_0_final = np.fmax(ds1, ds2)
# finds the max of all the datasets in ds_ge_15
for i in range(len(ds_ge_15) - 1):
ds1 = ds_ge_15[i]
ds2 = ds_ge_15[i+1]
ds_ge_15_final = np.fmax(ds1, ds2)
извинения. ds — это просто отредактированная версия xf1. это одни и те же данные
Это прекрасно. Смысл здесь в том, чтобы показать, как использовать массивы, чтобы делать то, что вы делали с exec
.
Я сделал несколько правок, чтобы достичь нужной мне цели, но теперь это работает. Спасибо!
Функция
exec
ничего не возвращает.exec
— невероятно опасная операция, и ее следует избегать любой ценой. То, что вы здесь делаете, следует делать со списком или словарем. Создайте список под названиемds_ge_0
и добавьте в него свои элементы.